java – LocalDate减去Period得到错误的结果
发布时间:2020-05-27 07:38:35 所属栏目:Java 来源:互联网
导读:LocalDate减去一个Period(如“28年,1个月和27天”),得到错误的结果. 但减去一个时期(只有天数单位,如“10282”天)得到正确的结果. 有什么需要注意的吗? public static void main(String[] args) { printAgeAndBirthday(1989, 2, 22); printBirthdayFromPerio
|
LocalDate减去一个Period(如“28年,1个月和27天”),得到错误的结果. 但减去一个时期(只有天数单位,如“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 解决方法您的案例可以简化为LocalDate date1 = LocalDate.of(2017,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,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 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- java – 如何忽略JUnit / easymock中的意外方法调
- 如果Java程序员想要传递一个函数,他们在Java 8之
- java – 关闭BufferedOutputStream还关闭了底层的
- java json不生成null或者空字符串属性(详解)
- 移动开发Spring Boot外置tomcat教程及解决方法
- java-根据用户选择/输入从集合中过滤对象
- java – 有一个更快的方法然后StringBuilder最多
- java – 为什么这个Scala代码在运行时抛出Illega
- java – 在ElasticSearch中获取SearchResponse的
- java – 包含Icon的JComboBox在Mac上太小了
热点阅读
