Java LocalDate和Epoch之间的转换

2025/04/15

1. 概述

在本教程中,我们将演示Java的LocalDate和Epoch之间的相互转换。

2. Epoch与LocalDate

要进行转换,理解Epoch和LocalDate背后的概念至关重要。Java中的“Epoch”指的是1970-01-01T00:00:00Z这一时刻,Epoch之后的时刻将为正值。同样,Epoch之前的任何时刻都将为负值。

Epoch、LocalDate和LocalDateTime的所有实例都与时区相关,因此,在从一个实例转换为另一个实例时,我们必须知道时区。在Java中,时区可以通过ZoneId类表示。ZoneId可以是通过方法ZoneId.systemDefault()获取的系统时区。或者,也可以通过传递一个已知时区(例如Europe/Amsterdam)的字符串来计算ZoneId。

3. 纪元转为日期/时间

我们可以根据自纪元以来的毫秒数来计算LocalDate或LocalDateTime,或者,计数也可以以秒为单位,或者以纳秒为单位的秒数,此计数的Java数据类型为Long。最后,我们还需要知道时区,让我们看看如何进行转换:

long milliSecondsSinceEpoch = 2131242L;
ZoneId zoneId = ZoneId.of("Europe/Amsterdam");
LocalDate date = Instant.ofEpochMilli(milliSecondsSinceEpoch).atZone(zoneId).toLocalDate();

在上面的代码片段中,我们获得了自阿姆斯特丹时区纪元以来的毫秒数,因此我们可以使用Instant类的ofEpochMilli()方法来获取LocalDate值。否则,如果我们想要获取时间而不是日期,那么我们可以这样写:

LocalDateTime time = Instant.ofEpochMilli(milliSecondsSinceEpoch).atZone(zoneId).toLocalDateTime();

在上面的代码片段中,我们使用了相同的方法,但使用了toLocalDateTime方法。

4. 日期/时间转为纪元

如果我们在给定时区中有一个LocalDate日期,那么我们就可以获取以秒为单位的纪元时间,让我们看看如何操作:

ZoneId zoneId = ZoneId.of("Europe/Tallinn"); 
LocalDate date = LocalDate.now(); 
long EpochMilliSecondsAtDate = date.atStartOfDay(zoneId).toInstant().toEpochMilli();

在上面的例子中,我们获取了当前日期的纪元秒数以及系统当前所在的时区。请注意,我们只能获取当天开始的纪元计数,这是因为LocalDate没有任何时间值信息。或者,如果我们有时间部分,我们可以获取给定时刻的精确纪元计数:

LocalDateTime localDateTime = LocalDateTime.parse("2019-11-15T13:15:30");
long epochMilliSecondsAtTime = localDateTime.atZone(zoneId).toInstant().toEpochMilli();

5. 总结

在本文中,我们探讨了如何将Epoch转换为LocalDate和LocalDateTime,我们还演示了如何将LocalDate或LocalDateTime转换为Epoch。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章