Meu desafio de domingo é obter e persistir dias úteis em um ano específico em um arquivo CSV etc.
Tenho o seguinte código e o problema que enfrento é: como imprimir datas em um formato específico, ou seja, AAAAMMDD, pois o código atualmente imprime algo como Sáb Jan 19 00:00:00 CET 2019.
Além disso, se eu puder excluir fins de semana e, geralmente, se houver uma maneira melhor de escrever um código muito menor no Java 8.
import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;
public class DatesInYear
{
public static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
public static void main (String[] args) throws java.lang.Exception
{
Date dt = new Date();
System.out.println(dt);
List<Date> dates = printDates("20190101","20191231");
Collections.reverse(dates);
System.out.println(dates.size());
for(Date date:dates)
{
SimpleDateFormat format1 = new SimpleDateFormat("yyyyMMdd");
System.out.println(format1.format(date));
}
}
public static List<Date> printDates(String fromDate, String toDate)
{
ArrayList<Date> dates = new ArrayList<Date>();
try {
Calendar fromCal = Calendar.getInstance();
fromCal.setTime(dateFormat .parse(fromDate));
Calendar toCal = Calendar.getInstance();
toCal.setTime(dateFormat .parse(toDate));
while(!fromCal.after(toCal))
{
dates.add(fromCal.getTime());
fromCal.add(Calendar.DATE, 1);
}
} catch (Exception e) {
System.out.println(e);
}
return dates;
}
}
System.out.println(date)
, use odateFormat
que você já criou para formatá-lo da maneira que você precisar.String date1 = format1.format(date);
então você não faz nada comdate1
. Mas você está no caminho certo.Calendar
também pode ser usado para verificar o dia da semana.Respostas:
Aqui estão duas tomadas ligeiramente diferentes para o seu problema:
fonte
IntStream
? Ele exibirá as datas duas vezes. Ou por que você não deixa apenas o primeiroIntStream
e altera o tipo de retorno para nulo? Eu só estou curioso.Desde 2020, você realmente deve estar adotando a
java.time.*
API.Embora eu tenha certeza de que provavelmente há uma maneira realmente interessante de obter os dias "úteis" entre as datas, eu segui o método da força bruta ...
Em seguida, você pode simplesmente usar a
DateTimeFormatter
para formatar oLocalDate
em um formato desejado, por exemplo ...fonte
LongStream.rangeClosed(0, steps).mapToObj( n -> this.plusMonths(months * n).plusDays(days * n));
... Mas em relação ao seu código, issoArrayList
pode ter o tamanho de240
uma estimativa aproximada de360 - 2 * 40
. Além disso, quando você tem um,if(condition) {NO-OP} else {OP}
deve ser alterado paraif(!condition){OP}
fonte
Uma maneira lúcida de exibir todos os dias da semana em um período usando o Java 8 e a API de data e hora moderna é a seguinte:
Resultado:
fonte
ChronoUnit.DAYS.between(startDate, endDate)
em uma variável em vez de recalcular o tempo todo. Além disso, para o código Java 9+, pode-se usar em.takeWhile(endDate::isAfter)
vez delimit()
. Além disso, você pode usar a comparação enum em vez de comparar os nomes dos dias da semana:!(d -> d.getDayOfWeek() == DayOfWeek.SUNDAY || d.getDayOfWeek() == DayOfWeek.SUNDAY)
ChronoUnit.DAYS.between(startDate, endDate)
vez de recalcular o tempo todo. Preciso da sua ajuda para entender se não estava correto.d.getDayOfWeek().name().equals("SATURDAY")
quandod.getDayOfWeek() == DayOfWeek.SATURDAY
o que seria mais robusto - IMHO}
fonte
tente isto:
// Usando Java 8
fonte