我有一个表示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
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类.
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 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,和更多.
getTime()返回"自1970年1月1日,格林威治标准时间00:00:00以来的毫秒数",仅此而已(显然,您必须正确创建它).您可以根据需要对其进行格式化,例如从GregorianCalendar(TimeZone)构造函数开始.
| 归档时间: |
|
| 查看次数: |
78139 次 |
| 最近记录: |