我在Java中的Date类有问题。日期类返回本地机器日期,但我需要UTC-0。
我已经搜寻了一下,找到了JavaScript的绝佳解决方案,但Java却没什么用。
如何在Java 8中获取UTC + 0日期?
我在Java中的Date类有问题。日期类返回本地机器日期,但我需要UTC-0。
我已经搜寻了一下,找到了JavaScript的绝佳解决方案,但Java却没什么用。
如何在Java 8中获取UTC + 0日期?
Answers:
使用Java 8,您可以编写:
OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);
要回答您的评论,您可以将其转换为日期(除非您依赖于旧代码,我看不到任何原因)或自时代以来转换为毫。
Date date = Date.from(utc.toInstant());
long epochMillis = utc.toEpochSecond() * 1000;
OffsetDateTime
而不是ZonedDateTime
假设我们仅使用距UTC的偏移量而不是整个时区工作,这会更合适吗?
Instant.now()
与Java最早版本捆绑在一起的麻烦的旧日期时间类已由内置在Java 8及更高版本中的java.time类所取代。请参阅Oracle教程。许多功能已被后移植到Java 6和7在ThreeTen-反向移植和在进一步适于到Android ThreeTenABP。
Instant
An Instant
代表UTC时间线上的一个时刻,分辨率最高为ns。
Instant instant = Instant.now();
该toString
方法使用标准ISO 8601格式之一生成带有文本的String对象,该文本表示日期时间值。
String output = instant.toString();
2016-06-27T19:15:25.864Z
该Instant
班是java.time一个基本构建块类。在处理日期时间时,这应该是您的首选课程,因为最佳实践通常是在UTC中跟踪,存储和交换日期时间值。
OffsetDateTime
但是Instant
有局限性,例如没有格式选项可用于生成备用格式的字符串。要获得更大的灵活性,请从转换Instant
为OffsetDateTime
。指定从UTC的偏移量。在java.time中,这意味着一个ZoneOffset
对象。在这里,我们要坚持使用UTC(+00),以便可以使用便捷的常量ZoneOffset.UTC
。
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
2016-06-27T19:15:25.864Z
或跳过Instant
课程。
OffsetDateTime.now( ZoneOffset.UTC )
现在有了一个OffsetDateTime
对象,您就可以DateTimeFormatter
用来创建具有替代格式文本的String对象。在Search Stack Overflow中搜索有关使用的许多示例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类?
ZonedDateTime
就不需要使用DST了,因为所有DST 都ZoneId
可以映射到ZoneOffset
我们可以使用的DST上OffsetDateTime
?
在java8中,我将使用UTC中Instant
已经存在且易于使用的类。
import java.time.Instant;
Instant ins = Instant.now();
long ts = ins.toEpochMilli();
Instant ins2 = Instant.ofEpochMilli(ts)
另外,您可以使用以下方法:
import java.time.*;
Instant ins = Instant.now();
OffsetDateTime odt = ins.atOffset(ZoneOffset.UTC);
ZonedDateTime zdt = ins.atZone(ZoneId.of("UTC"));
回到 Instant
Instant ins4 = Instant.from(odt);
在Java8中,您使用新的Time API,然后使用UTC TimeZone将Instant转换为ZonedDateTime。
Java 8中的1行解决方案:
public Date getCurrentUtcTime() {
return Date.from(Instant.now());
}
java.util.Date
绝不是本地计算机日期。自1970年1月1日起,相对于UTC + 00:00,始终将其定义为经过的毫秒数。也许其方法的行为toString()
使您感到困惑,而这确实在本地时区使用了表示形式。