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 eldateFormat
que 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.Calendar
tambié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 primeroIntStream
y 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
DateTimeFormatter
para formatear elLocalDate
formato 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, esoArrayList
podría tener el tamaño de240
una 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.SATURDAY
que sería más robusto - En mi humilde opinión}
fuente
prueba esto:
// Usando Java 8
fuente