Ich habe ein lokales Datum, das den ersten und letzten Tag des Monats abrufen muss. Wie mache ich das?
z.B. 13/2/2014
Ich muss 1/2/2014
und 28/2/2014
in LocalDate- Formaten.
Verwenden der threeten LocalDate-Klasse.
Ich habe ein lokales Datum, das den ersten und letzten Tag des Monats abrufen muss. Wie mache ich das?
z.B. 13/2/2014
Ich muss 1/2/2014
und 28/2/2014
in LocalDate- Formaten.
Verwenden der threeten LocalDate-Klasse.
Antworten:
Die API wurde entwickelt, um eine Lösung zu unterstützen, die den Geschäftsanforderungen genau entspricht
import static java.time.temporal.TemporalAdjusters.*;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.with(firstDayOfMonth());
LocalDate end = initial.with(lastDayOfMonth());
Jons Lösungen sind jedoch auch in Ordnung.
YearMonth
Der Vollständigkeit halber und meiner Meinung nach eleganter, siehe diese Verwendung der YearMonth
Klasse.
YearMonth month = YearMonth.from(date);
LocalDate start = month.atDay(1);
LocalDate end = month.atEndOfMonth();
Für den ersten und letzten Tag des aktuellen Monats lautet dies:
LocalDate start = YearMonth.now().atDay(1);
LocalDate end = YearMonth.now().atEndOfMonth();
LocalDate
with
Methode?
LocalDate
Instanz.
Die Antwort von Jon Skeets ist richtig und hat meine Zustimmung verdient, der Vollständigkeit halber nur diese etwas andere Lösung hinzugefügt:
import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.with(lastDayOfMonth());
Wenn jemand nach dem ersten Tag des Vormonats und dem letzten Tag des Vormonats sucht :
public static LocalDate firstDayOfPreviousMonth(LocalDate date) {
return date.minusMonths(1).withDayOfMonth(1);
}
public static LocalDate lastDayOfPreviousMonth(LocalDate date) {
return date.withDayOfMonth(1).minusDays(1);
}
Sie können dies versuchen, um zu vermeiden, dass ein benutzerdefiniertes Datum angegeben wird und Start- und Enddaten des aktuellen Monats angezeigt werden müssen:
LocalDate start = LocalDate.now().minusDays(LocalDate.now().getDayOfMonth()-1);
LocalDate end = LocalDate.now().minusDays(LocalDate.now().getDayOfMonth()).plusMonths(1);
System.out.println("Start of month: " + start);
System.out.println("End of month: " + end);
Ergebnis:
> Start of month: 2019-12-01
> End of month: 2019-12-30
Versuche dies:
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.withDayOfMonth(initial.getMonthOfYear().getLastDayOfMonth(false));
System.out.println(start);
System.out.println(end);
Sie können die gewünschte Ausgabe finden, müssen sich jedoch um den Parameter true / false für die Methode getLastDayOfMonth kümmern
Dieser Parameter bezeichnet das Schaltjahr
getLastDayOfMonth
- siehe meine Antwort für einen einfacheren Ansatz.
Wenn Sie dies nur mit der LocalDate-Klasse tun möchten:
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = LocalDate.of(initial.getYear(), initial.getMonthValue(),1);
// Idea: the last day is the same as the first day of next month minus one day.
LocalDate end = LocalDate.of(initial.getYear(), initial.getMonthValue(), 1).plusMonths(1).minusDays(1);
Nur hier, um meine Implementierung für die @ herman-Lösung zu zeigen
ZoneId americaLaPazZone = ZoneId.of("UTC-04:00");
static Date firstDateOfMonth(Date date) {
LocalDate localDate = convertToLocalDateWithTimezone(date);
YearMonth baseMonth = YearMonth.from(localDate);
LocalDateTime initialDate = baseMonth.atDay(firstDayOfMonth).atStartOfDay();
return Date.from(initialDate.atZone(americaLaPazZone).toInstant());
}
static Date lastDateOfMonth(Date date) {
LocalDate localDate = convertToLocalDateWithTimezone(date);
YearMonth baseMonth = YearMonth.from(localDate);
LocalDateTime lastDate = baseMonth.atEndOfMonth().atTime(23, 59, 59);
return Date.from(lastDate.atZone(americaLaPazZone).toInstant());
}
static LocalDate convertToLocalDateWithTimezone(Date date) {
return LocalDateTime.from(date.toInstant().atZone(americaLaPazZone)).toLocalDate();
}
LocalDateTime
ist genau die falsche Klasse, die hier verwendet wird. Sie verwerfen wertvolle Zonen- / Versatzinformationen.
Date
hat nichts mit der Frage zu tun und sollte generell vermieden werden.
ZoneId.of("America/La_Paz")
. Für heutige Daten wird es das gleiche Ergebnis geben, aber möglicherweise nicht für historische Daten oder Daten in einer weiteren Zukunft.