Java 中和日期直接相关的类有很多,平时最常用到的就是 java.util package 下面的 Date 和 Calendar,需要用到格式的时候还会用到 java.text.SimpleDateFormat
首先吐槽一下,Date 和 Calendar 实际用起来还是有一些别扭的,刚开始用的时候不熟悉,老是分不清 Date 和 Calendar 类的具体用法和区别。
而且 Calendar 类的 set 方法来设置日期时又有一些反人类,设置月份的时候总是要脑补一下减去 1,比如要设置为 2018 年 1 月 6 日就要设置成 2018,0,6,因为在这里一月是用 0 来表示的:
- Calendar cal = Calendar.getInstance();
- cal.set(2018, 0, 8);
具体的原因可以看这里的回答: StackOverflow: Why is January month 0 in Java Calendar?
反正我是不太看得下去。。
前几天有一个简单的需求,就是根据某两个日期来计算出年龄。上网查了一下,直接抛弃了难用的 Date 和 Calendar 类,直接用 java.time.LocalDate 来做。话不多说直接上代码:
- import java.time.LocalDate;
- public class TestLocalDate {
- public static void main(String[] args) {
- LocalDate date1 = LocalDate.of(2018, 1, 6);
- LocalDate date2 = LocalDate.of(1991, 1, 3);
- int age = date2.until(date1).getYears();
- System.out.println("You're " + age + " years old.");
- }
- }
输出结果:
- You 're 27 years old.'
抛弃了略显复杂令人头大的 Date 和 Calendar 类之间的互相转换调用,代码读起来也特别清晰,是不是很爽!
java.time 是 Java 8 中新引入的一个日期时间库,下面的这些方法都是 java.time 包里面的。
下面来看一下这段代码是怎么来用简单清爽的方式计算时间差的:
首先,LocalDate 是一个 immutable class(不可变类),所以和 String 类一样,不需要 new 一个新的对象才可以使用(?)
然后是 LocalDate 类用于设定日期的 of 方法:
- public static LocalDate of(int year, Month month, int dayOfMonth)
- public static LocalDate of(int year, int month, int dayOfMonth)
of 一共有三个重载的方法,这里举出其中的两个。第一个的 Month 类是一个枚举类型,包含了月份的英文名称,如 JANUARY, NOVEMBER 等
第二个就是再正常不过的设置年月日,好消息是这里的 month 是从 1 开始的,也就是说再也不用手动减去 1 了!!!
下面是 LocalDate 类用于比较日期的 until 方法:
- public Period until(ChronoLocalDate endDateExclusive)
这个方法返回的是一个 Period 类型的对象。
Period 代表的是形如 "2 年,3 个月,4 天" 的一段时间间隔。接下来调用的 getYears 方法就是属于 Period 类的。
最后再来看一下 Period 类的一些获取时间间隔的方法:
- public int getYears()
- public int getMonths()
- public int getDays()
这三个方法分别用于获取时间间隔的年、月和日。对,就是这么简单。
闲来无事时看看语言的新特性,多掌握些技能总是不会错的。
来源: https://www.cnblogs.com/limuyuan/p/java-use-localdate-calculate-age.html