Java 8为日期和时间提供了一个全新的API。这个API中最有用的类之一是LocalDateTime为了保持时区独立的日期和时间值。
java.util.Date为此可能有数百万行代码使用旧类。因此,在连接新旧代码时,需要在两者之间进行转换。由于似乎没有直接的方法来完成这个任务,所以怎么做呢?
Java中,在java.time.LocalDateTime和java.util.Date之间转换
简短的回答:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
尽管它的名字是java.util.Date但它在时间线上代表瞬间,而不是“日期”。存储在对象中的实际数据是long自1970-01-01T00:00Z(1970年GMT / UTC开始时的午夜)算起的毫秒数。
java.util.Date在JSR-310中的等价类是Instant,因此有方便的方法来提供转换来回:
Date input = new Date();
Instant instant = input.toInstant();
Date output = Date.from(instant);
一个java.util.Date实例没有时区的概念。
一个Instant还没有关于时区的任何信息。因此,要从Instant一个本地日期时间转换,有必要指定一个时区。这可能是默认区域 - ZoneId.systemDefault()或者它可能是您的应用程序控制的时区,例如来自用户首选项的时区。LocalDateTime有一个方便的工厂方法,可同时处理即时和时区:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
相反,LocalDateTime通过调用atZone(ZoneId)方法来指定时区。所述ZonedDateTime然后可以直接转化为Instant:
LocalDateTime ldt = ...
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Date output = Date.from(zdt.toInstant());
请注意,转换LocalDateTime为ZonedDateTime有可能造成一些比较意外的情况。这是因为由于夏令时并不是每个本地日期时间都存在。而在秋季/秋季,当地时间线上会出现两次相同的本地日期 - 时间重叠。