Java日期时间API系列34

Wesley13
• 阅读 682

  通过Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别中得知,Period可以比较2个日期相差的年月日。年龄计算是2个日期相差的年的值,具体还要根据月日微调,如果小于生日年龄减1。下面使用Period可以非常方便的计算年龄。

1.使用Period一行代码计算生日

核心代码就是一行代码: 

Period.between(birthDay, LocalDate.now()).getYears();

/\*\* \* 计算年龄
 \* @param birthDay
 \* @return int 年龄 \*/
public static int getAge(LocalDate birthDay){
    Objects.requireNonNull(birthDay, "birthDay");
    Period period \= Period.between(birthDay, LocalDate.now()); if (period.getYears() < 0) { throw new DateTimeException("birthDay is before now!");
    } else { return period.getYears();
    }
} /\*\* \* 计算年龄
 \* @param birthDay
 \* @return int 年龄 \*/
public static int getAge(Date birthDay){ return getAge(DateTimeConverterUtil.toLocalDate(birthDay));
} /\*\* \* 计算年龄
 \* @param birthDay
 \* @return int 年龄 \*/
public static int getAge(LocalDateTime birthDay){ return getAge(DateTimeConverterUtil.toLocalDate(birthDay));
}

测试代码:

/\*\* \* 年龄生日测试 \*/ @Test public void getAgeBirthDayTest(){
    Date date \= DateTimeCalculatorUtil.getDate(2000, 6, 4);
    System.out.println(DateTimeCalculatorUtil.getAge(date));
    
}

输出:

20

2.使用Java8以前的Calendar计算生日

public static int getAgeByBirth(Date birthDay) throws ParseException { int age = 0; Calendar cal = Calendar.getInstance(); if (cal.before(birthDay)) { //出生日期晚于当前时间,无法计算 throw new IllegalArgumentException( "The birthDay is before Now.It's unbelievable!"); } int yearNow = cal.get(Calendar.YEAR); //当前年份 int monthNow = cal.get(Calendar.MONTH); //当前月份 int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH); //当前日期 cal.setTime(birthDay); int yearBirth = cal.get(Calendar.YEAR); int monthBirth = cal.get(Calendar.MONTH); int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH); age = yearNow - yearBirth; //计算整岁数 if (monthNow <= monthBirth) { if (monthNow == monthBirth) { if (dayOfMonthNow < dayOfMonthBirth) age--;//当前日期在生日之前,年龄减一 } else { age--;//当前月份在生日之前,年龄减一 } } return age; }

原地址:https://blog.csdn.net/sunnyljs/java/article/details/80934685

测试代码

@Test public void getAgeByBirthTest() throws ParseException{ Date date = DateTimeCalculatorUtil.getDate(2000, 6, 4); System.out.println(getAgeByBirth(date)); }

输出

20

3.对比上面2种方法,Java8 时间api非常方便。

(1)Period线程安全。

(2)Period一行代码非常简洁。

源代码地址:https://github.com/xkzhangsan/xk-time

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
Java日期时间API系列20
  Java日期时间API系列19Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnbl
Wesley13 Wesley13
3年前
Java日期时间API系列19
  通过Java日期时间API系列6Jdk8中java.time包中的新的日期时间API类(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fxkzhangsanx%2Fp%2F12052195.html)中时间范围示意图:可以很清晰的看出Zo
Wesley13 Wesley13
3年前
Java日期时间API系列25
  通过Java日期时间API系列24Jdk8中java.time包中的新的日期时间API类,MonthDay类源码和应用,对比相同月日时间。(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.cnblogs.com%2F%2520https%3A%2F%2F%2F%2Fw
Wesley13 Wesley13
3年前
Java8 必会的日期处理的实践,必须收藏!
编辑:业余草来源:https://www.xttblog.com/?p4944Java8日期处理Java8推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。Java处理日期、日历
Wesley13 Wesley13
3年前
Java日期时间API系列13
  从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转Date。下面是时间类互相转换大全,包含Instant、LocalDate、LocalDateTime、LocalTime、ZonedDateTime和Dat
Wesley13 Wesley13
3年前
Java8中计算日期时间差
一.简述在Java8中,我们可以使用以下类来计算日期时间差异:1.Period2.Duration3.ChronoUnit二.Period类主要是Period类方法getYears(),getMonths()和getDays()来计算.示例:
Wesley13 Wesley13
3年前
Java日期时间API系列35
  通过Java日期时间API系列1Jdk7及以前的日期时间类(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fxkzhangsanx%2Fp%2F12032719.html)中得知,Java8以前除了java.sql.Timestamp扩充
Wesley13 Wesley13
3年前
Java日期时间API系列33
  从Java日期时间API系列10Jdk8中java.time包中的新的日期时间API类的DateTimeFormatter(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fxkzhangsanx%2Fp%2F12113489.html)中
Wesley13 Wesley13
3年前
Java 日期与时间
Java的日期Java没有内置的日期类,但可以导入java.time包,这个包中包含了许多类,可用于处理日期和时间。例如:<table<tbody<tr<thstyle"width:25%"Java类</th<thstyle"width:75%"描述</th</tr<tr<td<code