LocalDate
minus ein Period
(wie „28 Jahre, 1 Monat und 27 Tage“), erhalten falsches Ergebnis.
Aber minus ein Period
(nur Tage - Einheit hat, wie „10282“ Tage) erhalten richtiges Ergebnis. Gibt es etwas zu bemerken?
public static void main(String[] args) {
printAgeAndBirthday(1989, 2, 22);
printBirthdayFromPeriod(28, 1, 27);
}
private static void printBirthdayFromPeriod(int years, int months, int days) {
final Period period = Period.of(years, months, days);
final LocalDate now = LocalDate.now();
final LocalDate birthday = now.minus(28, ChronoUnit.YEARS)
.minus(1, ChronoUnit.MONTHS)
.minus(27, ChronoUnit.DAYS);
System.out.println("your birthday is : "+ birthday);//1989-02-19
System.out.println("your birthday is : "+ now.minusYears(28).minusMonths(1).minusDays(27));//1989-02-19
System.out.println("your birthday is : "+ now.minus(period));//1989-02-19
System.out.println("your birthday is : "+period.subtractFrom(now));//1989-02-19
System.out.println("your birthday is : "+ now.minus(Period.ofDays(10282)));//1989-02-22
}
private static void printAgeAndBirthday(int year, int month, int dayOfMonth) {
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(year, month, dayOfMonth);
Period p = Period.between(birthday, today);
long p2 = ChronoUnit.DAYS.between(birthday, today);
System.out.printf("You are %d years, %d months, and %d days old. (%d days total)%n",
p.getYears(), p.getMonths(), p.getDays(), p2);
LocalDate nextBDay = birthday.withYear(today.getYear());
//If your birthday has occurred this year already, add 1 to the year.
if (nextBDay.isBefore(today) || nextBDay.isEqual(today)) {
nextBDay = nextBDay.plusYears(1);
}
Period p_1 = Period.between(today, nextBDay);
long p_2 = ChronoUnit.DAYS.between(today, nextBDay);
System.out.printf("There are %d months, and %d days until your next birthday. (%d total)%n",
p_1.getMonths(), p_1.getDays(), p_2);
}
das Konsolenprotokoll:
You are 28 years, 1 months, and 27 days old. (10282 days total)
There are 10 months, and 4 days until your next birthday. (310 total)
your birthday is : 1989-02-19
your birthday is : 1989-02-19
your birthday is : 1989-02-19
your birthday is : 1989-02-19
your birthday is : 1989-02-22
Java-Version: jdk1.8.0_45
Ihr Fall kann vereinfacht werden
LocalDate date1 = LocalDate.of(2017, 2, 22), date2 = LocalDate.of(2017, 4, 18);
Period p = Period.between(date1, date2);
System.out.println("date1 + p: "+date1.plus(p));
System.out.println("date2 - p: "+date2.minus(p));
was druckt
date1 + p: 2017-04-18
date2 - p: 2017-02-19
Mit anderen Worten, ist die Anzahl der Jahre irrelevant (es sei denn, eine der Jahre ein Schaltjahr beteiligt ist und der andere nicht, aber hier, beide sind nicht). Im Folgenden wird die Ausgabe:
February March April
19 20 21 22 23 24 25 26 27 28 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
↑ │ ↑ ↑
│ └──────────────────────────── plus one Month ───────────────────────────────────────┴───────────────────────── plus 27 days ─────────────────────────────────────────┤
│ ↑ ↓
└───────────────────────── minus 27 days ────────────────────────────────────────┴─────────────────── minus one month ────────────────────────────────────────────────────────┘
Dies wird sich ändern, wenn Sie die Richtung wechseln:
Period p2 = Period.between(date2, date1);
System.out.println("date1 - p2: "+date1.minus(p2));
System.out.println("date2 + p2: "+date2.plus(p2));
was druckt
date1 - p2: 2017-04-15
date2 + p2: 2017-02-22
Also, wenn Sie einen Zeitraum in Jahren, Monaten und Tagen auszudrücken, wird die Richtung relevant. Im Gegensatz dazu ist die einfache Zahl der Tage zwischen zwei Daten unveränderlich:
LocalDate date1 = LocalDate.of(2017, 2, 22), date2 = LocalDate.of(2017, 4, 18);
Period p = Period.ofDays((int)ChronoUnit.DAYS.between(date1, date2));
System.out.println("date1 + p: "+date1.plus(p));
System.out.println("date2 - p: "+date2.minus(p));
date1 + p: 2017-04-18
date2 - p: 2017-02-22
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen