如何在Java 8中获取UTC + 0日期?tl;博士java.time关于 java.time
我在Java中的日期类有问题。日期类返回本地计算机日期,但我需要UTC-0。
我已经谷歌搜索并找到了JavaScript的出色解决方案,但对于Java来说没有任何用处。
如何在Java 8中获取UTC + 0日期?
我在Java中的日期类有问题。日期类返回本地计算机日期,但我需要UTC-0。
我已经谷歌搜索并找到了JavaScript的出色解决方案,但对于Java来说没有任何用处。
如何在Java 8中获取UTC + 0日期?
Instant.now()
与最早版本的Java捆绑在一起的麻烦的旧日期时间类已被Java 8及更高版本中内置的java.time类所取代。请参阅 Oracle 教程。大部分功能已经移植到ThreeTen-Backport中的Java 6和7,并在ThreeTenABP中进一步适应Android。
Instant
即时
以 UTC 表示时间轴上的某个时刻,分辨率最高可达纳秒。
Instant instant = Instant.now();
该方法生成一个 String 对象,其中包含使用标准 ISO 8601 格式之一表示日期时间值的文本。toString
String output = instant.toString();
2016-06-27T10:15:25.864Z
该类是 java.time 中的基本构建块类。在处理日期时间时,这应该是您的首选课程,因为通常最佳做法是以 UTC 格式跟踪、存储和交换日期时间值。Instant
OffsetDateTime
但是有一些限制,例如没有用于生成备用格式字符串的格式选项。为了获得更大的灵活性,请从 转换为 OffsetDateTime
。指定与 UTC 的偏移量。在java.time中,这意味着一个ZoneOffset
对象。在这里,我们希望坚持使用UTC(+00),这样我们就可以使用方便的常量ZoneOffset.UTC
。Instant
Instant
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
2016-06-27T10:15:25.864Z
或者跳过课程。Instant
OffsetDateTime.now( ZoneOffset.UTC )
现在,有了对象,您可以使用 DateTimeFormatter
创建包含替代格式文本的 String 对象。搜索堆栈溢出,了解许多使用 .OffsetDateTime
DateTimeFormatter
ZonedDateTime
如果要显示某个特定时区的挂钟时间,请应用 ZoneId
以获取 ZonedDateTime
。
在此示例中,我们应用蒙特利尔时区。在夏季,在夏令时 (DST) 废话下,该区域的偏移量为 。因此,请注意,一天中的时间在输出中比小时早四个小时,而不是几小时。 两者都代表了完全相同的同时时刻,只是通过两个不同的镜头来观察。-04:00
15
19
Instant
ZonedDateTime
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
2016-06-27T15:15:25.864-04:00[美国/蒙特利尔]
虽然应避免使用旧的日期时间类,但如果必须,则可以使用添加到旧类的新方法进行转换。在这里,我们使用java.util.Date.from( Instant )
和java.util.Date::toInstant
。
java.util.Date utilDate = java.util.Date.from( instant );
然后朝另一个方向走。
Instant instant= utilDate.toInstant();
同样,查找添加到(子类 )以转换为 和 从 中转换的新方法。GregorianCalendar
Calendar
java.time.ZonedDateTime
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧旧日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 & JPA 2.2 支持 java.time。java.sql.*
从哪里获取 java.time 类?
使用Java 8,您可以编写:
OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);
要回答您的评论,您可以将其转换为日期(除非您依赖于旧代码,我看不出任何原因)或自纪元以来的 millis:
Date date = Date.from(utc.toInstant());
long epochMillis = utc.toInstant().toEpochMilli();