Mi desafío del domingo es obtener y persistir días hábiles en un año en particular en un archivo CSV, etc.
Tengo el siguiente código y el problema al que me enfrento es: cómo imprimir fechas en un formato específico, es decir, AAAAMMDD, ya que el código actualmente imprime algo como Sábado 19 de enero 00:00:00 CET 2019.
Además, si puedo excluir los fines de semana y, en general, si hay una mejor manera de escribir un código mucho más corto en 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 eldateFormatque ya hizo para formatearlo de la manera que lo necesita.String date1 = format1.format(date);a continuación, usted no hace nada con eldate1. Pero estás en el camino correcto.Calendartambién se puede usar para verificar el día de la semana.Respuestas:
Aquí hay 2 tomas ligeramente diferentes de su problema:
fuente
IntStream? Mostrará las fechas dos veces. ¿O por qué no dejas solo el primeroIntStreamy cambias el tipo de retorno a vacío? Tengo curiosidad.Como es 2020, realmente debería estar adoptando la
java.time.*API.Si bien estoy seguro de que probablemente haya una forma realmente ordenada de obtener los días "laborables" entre fechas, he optado por el método de fuerza bruta ...
Luego, simplemente puede usar a
DateTimeFormatterpara formatear elLocalDateformato que desee, por ejemplo ...fuente
LongStream.rangeClosed(0, steps).mapToObj( n -> this.plusMonths(months * n).plusDays(days * n));... Pero con respecto a su código, esoArrayListpodría tener el tamaño de240una estimación aproximada de360 - 2 * 40. Además, cuando tenga unif(condition) {NO-OP} else {OP}es debe cambiarse aif(!condition){OP}fuente
Una forma lúcida de mostrar todos los días de la semana en un rango de fechas utilizando Java 8 y la API moderna de fecha y hora es la siguiente:
Salida:
fuente
ChronoUnit.DAYS.between(startDate, endDate)en una variable en lugar de volver a calcular cada vez. Además, para el código Java 9+, se puede usar en.takeWhile(endDate::isAfter)lugar delimit(). Además, puede usar la comparación de enumeración en lugar de comparar nombres de días de la semana:!(d -> d.getDayOfWeek() == DayOfWeek.SUNDAY || d.getDayOfWeek() == DayOfWeek.SUNDAY)ChronoUnit.DAYS.between(startDate, endDate)lugar de volver a calcular cada vez. Necesito tu ayuda para entender si no fue correcto.d.getDayOfWeek().name().equals("SATURDAY")cuándo lod.getDayOfWeek() == DayOfWeek.SATURDAYque sería más robusto - En mi humilde opinión}
fuente
prueba esto:
// Usando Java 8
fuente