Java 8在java.time
包中包含了一组全新的时间日期API。新的日期API和开源的Joda-Time库差不多,但也有一些不同。我们通过一些例子来学习下如何使用新的Date API吧。
Clock
类提供了访问当前日期和时间的方法。Clock
是时区敏感的,可以用来取代System.currentTimeMillis()
来获取代表当前时间的微秒数。某一个特定的时间点也可以使用Instant
类来表示,Instant
也可以用来创建老的java.util.Date
对象。
Clock clock = Clock.systemDefaultZone();
long millis = clock.millis();
Instant instant = clock.instant();
Date legacyDate = Date.from(instant);
在新API中时区使用ZoneId
来表示。时区可以很方便的使用静态方法of
来获取到。
时区定义了到UTS时间的时间差,在Instant
时间点对象到本地日期对象之间转换的时候是极其重要的。
ZoneId zone1 = ZoneId.of("Europe/Berlin");
ZoneId zone2 = ZoneId.of("Brazil/East");
System.out.println(zone1.getRules());
System.out.println(zone2.getRules());
LocalTime
定义了一个没有时区信息的时间,例如晚上7点。下面的例子使用前面代码创建的时区创建了两个本地时间。之后比较时间并以小时和分钟为单位计算两个时间的时间差:
LocalTime now1 = LocalTime.now(zone1);
LocalTime now2 = LocalTime.now(zone2);
System.out.println(now1.isBefore(now2)); // false
long hoursBetween = ChronoUnit.HOURS.between(now1, now2);
long minutesBetween = ChronoUnit.MINUTES.between(now1, now2);
LocalDate
表示了一个确切的日期,比如2015-04-10。该对象值是不可变的,用起来和LocalTime
基本一致。下面的例子展示了如何给Date
对象加减天/月/年。另外要注意的是这些对象是不可变的,操作返回的总是一个新实例。
LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS);
LocalDate yesterday = tomorrow.minusDays(2);
LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4);
DayOfWeek dayOfWeek = independenceDay.getDayOfWeek();
LocalDateTime
同时表示了时间和日期,相当于前两节内容合并到一个对象上了。LocalDateTime
、LocalTime
和LocalDate
都是不可变的。LocalDateTime
提供了一些能访问具体字段的方法。
LocalDateTime time = LocalDateTime.of(2015, Month.April, 10, 4, 10, 1);
DayOfWeek dayOfWeek = time.getDayOfWeek();
附加上时区信息,就可以将其转换为一个时间点Instant
对象,Instant
时间点对象可以很容易的转换为老式的java.util.Date
:
在实际项目中,我们一般会通过Date
对象来对时间进行存储,但是Date
对象并没有开放相关的API对时间进行操作(比如修改当前hour的值)。此时,我们可以通过下列方式来在LocalDateTime
与Date
之间进行互相转换,将Date
转换为LocalDateTime
后再对时间进行操作:
Date
转换为 LocalDateTime
Date date = new Date();
Instant instant = Instant.ofEpochMilli(date.getTime());
LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
LocalDateTime
转换为 Date
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Date date = Date.from(zdt.toInstant());
更多关于Date API的内容,读者可以查看官方文档
登录发表评论 登录 注册