如何在Java 8中获得UTC + 0日期?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Java 8中获得UTC + 0日期?相关的知识,希望对你有一定的参考价值。
我在Java中遇到Date类问题。 Date类返回本地机器日期,但我需要UTC-0。
我用Google搜索并找到了很好的javascript解决方案,但对Java来说没用。
如何在Java 8中获得UTC + 0日期?
使用Java 8,您可以编写:
OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);
要回答您的评论,您可以将其转换为日期(除非您依赖遗留代码,我没有看到任何理由)或者从时代开始将其转换为millis:
Date date = Date.from(utc.toInstant());
long epochMillis = utc.toEpochSecond() * 1000;
tl;dr
Instant.now()
java.time
与最早版本的Java捆绑在一起的麻烦的旧日期时间类已被Java 8及更高版本中内置的java.time类所取代。见Oracle Tutorial。大部分功能已经被移植到ThreeTen-Backport的Java 6和7中,并在ThreeTenABP中进一步适应了android。
Instant
Instant
代表UTC时间轴上的一个时刻,分辨率高达nanoseconds。
Instant instant = Instant.now();
toString
方法使用标准ISO 8601格式之一生成一个String对象,其中的文本表示日期时间值。
String output = instant.toString();
2016-06-27t 19:15:兄弟.864克
Instant
类是java.time中的基本构建块类。在处理日期时间时,这应该是您的首选课程,因为通常最佳做法是以UTC格式跟踪,存储和交换日期时间值。
OffsetDateTime
但Instant
有一些限制,例如没有用于生成替代格式字符串的格式化选项。要获得更多灵活性,请将Instant
转换为OffsetDateTime
。指定offset-from-UTC。在java.time中,这意味着一个ZoneOffset
对象。在这里,我们希望坚持使用UTC(+00),以便我们可以使用方便的常量ZoneOffset.UTC
。
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
2016-06-27t 19:15:兄弟.864克
或者跳过Instant
课程。
OffsetDateTime.now( ZoneOffset.UTC )
现在有一个OffsetDateTime
对象,你可以使用DateTimeFormatter
创建具有替代格式文本的String对象。搜索Stack Overflow以获取使用DateTimeFormatter
的许多示例。
ZonedDateTime
当你想在某个特定的时区显示wall-clock time时,使用ZoneId
来获得ZonedDateTime
。
在此示例中,我们应用蒙特利尔时区。在夏天,在Daylight Saving Time (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转换。
About java.time
legacy框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.util.Date
日期时间类,如Calendar
,SimpleDateFormat
和Joda-Time。
现在在maintenance mode的java.time项目建议迁移到Oracle Tutorial班。
要了解更多信息,请参阅JSR 310。并搜索Stack Overflow以获取许多示例和解释。规格是JDBC driver。
您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的java.sql.*
。不需要字符串,不需要Java SE 8类。
从哪里获取java.time类?
- Java SE 9,Java SE 6,以及之后 内置。 带有捆绑实现的标准Java API的一部分。 Java 9增加了一些小功能和修复。
- Java SE 7和ThreeTen-Backport 大部分java.time功能都在Android中反向移植到Java 6和7。
- ThreeTenABP 更高版本的Android捆绑java.time类的实现。 对于早期的Android(<26),How to use ThreeTenABP…项目采用ThreeTen-Backport(如上所述)。见ThreeTen-Extra。
Interval
项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如YearWeek
,<
以上是关于如何在Java 8中获得UTC + 0日期?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ZonedDateTime 或 Java 8 将任何日期时间转换为 UTC
来自 ZonedDateTime UTC 实例的 Java 日期和时间戳
Python - 给定一个时区感知的日期时间对象,我如何获得一个时区朴素的 UTC 日期时间对象?