如何使date.getTime()返回UTC时间?

fly*_*ina 19 java date utc

我有一个表示UTC时间的Date对象.当我使用getTime()方法获取此对象的long值时,返回的值对应于我们的本地时间(美国中部).获取与原始UTC时间相对应的值的正确方法是什么?

谢谢

Ste*_*Kuo 23

java.util.Date没有时区概念.它只保留相对于纪元的时间,即1970年1月1日00:00:00 UTC.日期是一个模型,与视图分开.显示日期时,将应用时区的概念.Date的toString()在默认时区中显示人类可读日期.您可以使用a DateFormat以不同的时区(例如UTC)显示日期,也可以更改JVM的默认时区.


Pop*_*ops 22

DateFormat班有设置您的时区的方法,而且也具有时区类为UTC时间的设置.

所以,例如,

SimpleDateFormat sdf = new SimpleDateFormat();
sdf.setTimeZone(new SimpleTimeZone(SimpleTimeZone.UTC_TIME, "UTC"));
Date yourUtcDate = sdf.parse(yourOriginalDate);
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 22

TL;博士

Instant.now()
Run Code Online (Sandbox Code Playgroud)

…和…

Instant.ofEpochMilli( n ) 
Run Code Online (Sandbox Code Playgroud)

…和…

instant.toEpochMilli()
Run Code Online (Sandbox Code Playgroud)

Date 始终是UTC

当我使用getTime()方法获取此对象的long值时,返回的值对应于我们的本地时间(美国中部).

不,从Date::getTime()始终返回的值对应于UTC(在此上下文中几乎与GMT相同).引用课程文档:

返回自此Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数.

所以你的问题是荒谬的,因为a Date已经是UTC了.无需"获取与原始UTC时间相对应的值",

您可能会产生混淆的行为getTime与该的toString方法.该toString方法令人烦恼且容易混淆地在生成String的过程中应用当前的默认时区.因此字符串输出显示时区,而实际上没有时区可以设置或从Date自身获得.(实际上有一个区域,Date但这与此讨论无关.这个课程混乱!)

java.time

现代的方法是使用java.time类.

Instant

Instant级表示时间轴上的时刻UTC,分辨率为纳秒(最多9个(9)小数的位数).

获取当前时刻.

Instant instant = Instant.now();
Run Code Online (Sandbox Code Playgroud)

您可以Date通过调用添加到旧日期时间类的新转换方法之一将a转换为其现代替换.打电话toInstant,很简单.

Instant instant = myJavaUtilDate.toInstant();  
Run Code Online (Sandbox Code Playgroud)

我根本不建议使用从纪元开始的数字作为跟踪时间的方法.坚持使用java.time对象.在Java之外,序列化为文本使用ISO 8601格式.

但如果必须,您可以提取自1970-01-01T00:00:00Z纪元以来的毫秒数.请注意,这可能涉及数据丢失!An Instant具有更精细的纳秒分辨率.因此,毫秒可能会减少一小部分时间.

long millisecondsSinceEpoch = instant.toEpochMilli();  // Caution: Possible data-loss in going from nanoseconds to milliseconds.
Run Code Online (Sandbox Code Playgroud)

走向另一个方向,从数到数Instant.

Instant instant = Instant.ofEpochMilli( millisecondsSinceEpoch ) ;
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.

  • @Matthieu是的,巴黎的一个人和马尼拉的一个人同时在通话时同时创建一个文件夹,同时在电话上互相交谈时,都会看到此命令返回的相同“长”号(假设他们的计算机时钟是正确设置,并假设每个动作都完全同步)。该命令被记录为以UTC **返回自1970年第一时刻的纪元参考日期以来的毫秒数,与Java.time相同。使用上面在此答案中看到的Instant.ofEpochMilli(millisecondsSinceEpoch)代码。 (2认同)

Mat*_*hen 7

getTime()返回"自1970年1月1日,格林威治标准时间00:00:00以来的毫秒数",仅此而已(显然,您必须正确创建它).您可以根据需要对其进行格式化,例如从GregorianCalendar(TimeZone)构造函数开始.