<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
减去LocalDate
(例如&#34; 28年,1个月和27天&#34;),得到错误的结果。
但减去Period
(只有天数单位,例如&#34; 10282&#34;天)得到正确的结果。
有什么需要注意的吗?
Period
控制台日志:
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);
}
java版:jdk1.8.0_45
答案 0 :(得分:13)
您的案例可以简化为
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));
将打印
date1 + p: 2017-04-18
date2 - p: 2017-02-19
换句话说,年数是无关紧要的(除非其中一年是闰年而另一年不是,但在这里,两者都不是)。以下说明了这个问题:
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 ────────────────────────────────────────────────────────┘
如果您改变方向,这将改变:
Period p2 = Period.between(date2, date1);
System.out.println("date1 - p2: "+date1.minus(p2));
System.out.println("date2 + p2: "+date2.plus(p2));
将打印
date1 - p2: 2017-04-15
date2 + p2: 2017-02-22
因此,当您以年,月和日表示期间时,方向变得相关。相反,两个日期之间的平均天数是不变的:
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