将java.util.Date转换为java.time.LocalDate

问题:

java.util.Date对象转换为新的JDK 8 / JSR-310 java.time.LocalDate的最佳方式是什么?

Date input = new Date();
LocalDate date = ???

回答:

 简短的答案

Date input = new Date();
LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

 说明
尽管它的名称,java.util.Date表示时间线上的即时,而不是“日期”。存储在对象中的实际数据是自1970-01-01T00:00Z(1970年GMT / UTC开始的午夜)以来的毫秒数的long计数。
JSR-310中的等价类为java.util.DateInstant,因此提供了一种方便的方法toInstant()来提供转换:

Date input = new Date();
Instant instant = input.toInstant();

java.util.Date实例没有时区的概念。如果您在java.util.Date上调用toString(),因为toString相对于时区,这可能看起来很奇怪。但是,该方法实际上使用Java的默认时区来提供字符串。时区不是java.util.Date的实际状态的一部分
Instant也不包含有关时区的任何信息。因此,要从Instant转换为本地日期,需要指定时区。这可能是默认区域 – ZoneId.systemDefault() – 或者它可能是应用程序控制的时区,例如来自用户首选项的时区。使用atZone()方法应用时区:

Date input = new Date();
Instant instant = input.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());

A ZonedDateTime包含由本地日期和时间,时区和与GMT / UTC的偏移量组成的状态。因此,可以使用toLocalDate()轻松地提取日期 – LocalDate

Date input = new Date();
Instant instant = input.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
LocalDate date = zdt.toLocalDate();

 Java 9答案
在Java SE 9中,添加了一个new method,稍微简化了此任务:

Date input = new Date();
LocalDate date = LocalDate.ofInstant(input.toInstant(), ZoneId.systemDefault());

这种新的选择更直接,创造更少的垃圾,因此应该表现更好。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Convert java.util.Date to java.time.LocalDate

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

40 + = 43