将Java Date转换为OffsetDateTime

2025/04/14

1. 简介

在本教程中,我们将了解Date和OffsetDateTime之间的区别,我们还将学习如何在两者之间进行转换。

2. Date和OffsetDateTime之间的区别

OffsetDateTime是在JDK 8中引入的,作为java.util.Date的现代替代品。

OffsetDateTime是一个线程安全的类,它将日期和时间存储到纳秒的精度。另一方面,Date不是线程安全的,它将时间存储到毫秒的精度。

OffsetDateTime是一个基于值的类,这意味着我们在比较引用时需要使用equals而不是典型的==。

OffsetDateTime的toString方法的输出是ISO-8601格式,而Date的toString是自定义的非标准格式。

让我们对这两个类调用toString来查看区别:

Date: Sat Oct 19 17:12:30 2019
OffsetDateTime: 2019-10-19T17:12:30.174Z

Date对象无法存储时区及其对应的偏移量,Date对象唯一包含的内容是自1970年1月1日00:00:00 UTC以来的毫秒数,因此如果我们的时间不是UTC,我们应该将时区存储在辅助类中。相反,OffsetDateTime会在内部存储ZoneOffset

3. 将日期转换为OffsetDateTime

将Date转换为OffsetDateTime非常简单,如果我们的Date是UTC格式,我们可以使用一个表达式进行转换:

Date date = new Date();
OffsetDateTime offsetDateTime = date.toInstant()
    .atOffset(ZoneOffset.UTC);

如果原始日期不是UTC,我们可以提供偏移量(存储在辅助对象中,因为如前所述,Date类不能存储时区)。

假设我们的原始日期是+3:30(德黑兰时间):

int hour = 3;
int minute = 30;
OffsetDateTime offsetDateTime = date.toInstant()
    .atOffset(ZoneOffset.ofHoursMinutes(hour, minute));

另外,我们可以使用Date类中的getTimeZoneOffset()来计算当地时间和UTC之间的偏移量(以分钟为单位):

OffsetDateTime offsetDateTime = date.toInstant()
    .atOffset(ZoneOffset.ofTotalSeconds(date.getTimezoneOffset() * -60));

这里,我们将本地时间和UTC时间之间的分钟数转换为秒数,ZoneOffset.ofTotalSeconds()方法接收偏移量,即需要添加到UTC的秒数,以获得本地时间。由于getTimezoneOffset()方法返回的是相反的值(需要从本地时间中减去分钟数才能获得UTC时间),因此我们将其乘以-60以转换为秒数,并反转符号。

Date对象不存储任何时区信息,但是,调用Date对象的getTimezoneOffset()方法可以获取调用Date对象时的系统默认时区。

OffsetDateTime提供了许多实用的方法,可以在之后使用。例如,我们可以简单地使用getDayOfWeek()、getDayOfMonth()和getDayOfYear()。使用isAfter和isBefore方法比较两个OffsetDateTime对象也非常容易。

最重要的是,完全避免使用已弃用的Date类是一种很好的做法

4. 总结

在本教程中,我们介绍了从Date转换为OffsetDateTime的方法。

Show Disqus Comments

Post Directory

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