Meine sonntägliche Herausforderung besteht darin, Arbeitstage in einem bestimmten Jahr in eine CSV-Datei usw. zu integrieren.
Ich habe folgenden Code und das Problem, mit dem ich konfrontiert bin, ist: wie man Daten in einem bestimmten Format druckt, dh JJJJMMTT, da der Code derzeit so etwas wie Sa 19 Jan 00:00:00 CET 2019 druckt.
Auch wenn ich Wochenenden ausschließen kann und generell, wenn es eine bessere Möglichkeit gibt, einen viel kürzeren Code in Java 8 zu schreiben.
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)
Verwenden Sie nicht nur dasdateFormat
, was Sie bereits erstellt haben, um es so zu formatieren, wie Sie es benötigen.String date1 = format1.format(date);
dann machst du nichts mitdate1
. Aber Sie sind auf dem richtigen Weg.Calendar
kann auch verwendet werden, um den Wochentag zu überprüfen.Antworten:
Hier sind 2 etwas andere Ansichten zu Ihrem Problem:
quelle
IntStream
? Die Daten werden zweimal angezeigt. Oder warum lassen Sie nicht nur den erstenIntStream
und ändern den Rückgabetyp in ungültig? Ich bin nur Neugierig.Seit 2020 sollten Sie die
java.time.*
API wirklich nutzen .Ich bin mir zwar sicher, dass es wahrscheinlich eine wirklich gute Möglichkeit gibt, die "Arbeitstage" zwischen den Daten zu verschieben, aber ich habe mich für die Brute-Force-Methode entschieden ...
Dann können Sie einfach a verwenden,
DateTimeFormatter
um dasLocalDate
in ein gewünschtes Format zu formatieren, zum Beispiel ...quelle
LongStream.rangeClosed(0, steps).mapToObj( n -> this.plusMonths(months * n).plusDays(days * n));
... Aber in Bezug auf Ihren CodeArrayList
könnte das die Größe240
einer groben Schätzung von haben360 - 2 * 40
. Wenn Sie einif(condition) {NO-OP} else {OP}
is haben, sollten Sie es aufif(!condition){OP}
quelle
Eine übersichtliche Möglichkeit, alle Wochentage in einem Datumsbereich mit Java 8 und der modernen Datums- / Uhrzeit-API anzuzeigen, ist wie folgt:
Ausgabe:
quelle
ChronoUnit.DAYS.between(startDate, endDate)
in einer Variablen, anstatt jedes Mal neu zu berechnen. Auch für Java 9+ Code kann man.takeWhile(endDate::isAfter)
anstelle von verwendenlimit()
. Sie können auch den Enum-Vergleich verwenden, anstatt die Namen von Wochentagen zu vergleichen:!(d -> d.getDayOfWeek() == DayOfWeek.SUNDAY || d.getDayOfWeek() == DayOfWeek.SUNDAY)
ChronoUnit.DAYS.between(startDate, endDate)
anstatt jedes Mal neu zu berechnen. Ich brauche deine Hilfe, um zu verstehen, ob es nicht richtig war.d.getDayOfWeek().name().equals("SATURDAY")
wann ich das tun soll,d.getDayOfWeek() == DayOfWeek.SATURDAY
was robuster wäre - IMHO}}
quelle
Versuche dies:
// Java 8 verwenden
quelle