【发布时间】:2017-09-14 05:39:24
【问题描述】:
LocalDate 减去Period(如“28 年 1 个月 27 天”),得到错误的结果。
但是减去Period(只有天单位,比如“10282”天)得到正确的结果。
有什么要注意的吗?
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);
}
控制台日志:
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 版本:jdk1.8.0_45
【问题讨论】:
-
不要使用 Period 进行精确计算。请参阅此相关帖子:stackoverflow.com/questions/41945704/…
-
如果我从今天减去一个月零 27 天,我得到 2 月 19 日。所以这是正确的。
标签: java java-8 period localdate