如何使用Java在UTC中从纪元打印毫秒计数作为日期时间?

问题描述 投票:0回答:2

我正在尝试使用Java将以毫秒为单位的时间格式化为UTC日期。我有以下代码:

long ms = 1427590800000;
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.ROOT);
cal.setTimeInMillis(ms);
Date date = cal.getTime();
SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd hh:mm:ss");
System.out.println(dateFormat.format(date)); // 2015-03-29 02:00:00

这是使用BST(即使用默认时区)而不是UTC打印时间。日历上设置的时区似乎与打印日期没有关系。

UTC的实际时间由以下python代码段显示:

import datetime
ms = 1427590800000
print datetime.datetime.utcfromtimestamp(ms/1000.0) # 2015-03-29 01:00:00

将默认的JVM时区设置为“ UTC”会导致打印正确的日期,但这似乎不是一个安全的解决方案。

java date datetime timezone utc
2个回答
0
投票

如果需要所需的时区,则需要在格式化之前将timezone设置为格式化程序。

使用dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));,然后呼叫dateFormat.format(date)


0
投票

java.time

现代方法使用行业领先的java.time类。

解析为Instant,UTC中具有纳秒分辨率的时刻。

long input = 1_427_590_800_000L ;
Instant instant = Instant.ofEpochMilli( input ) ;

ISO 8601

生成标准ISO 8601格式的字符串。

String output = instant.toString() ;

2015-03-29T01:00:00Z


Table of date-time types in Java, both modern and legacy


关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Datejava.util.DateCalendar

要了解更多信息,请参见Calendar。并在Stack Overflow中搜索许多示例和说明。规格为SimpleDateFormat

SimpleDateFormat项目现在位于Oracle Tutorial中,建议迁移到JSR 310类。

您可以直接与数据库交换java.time对象。使用兼容Joda-Time或更高版本的maintenance mode。不需要字符串,不需要java.time类。

从哪里获取java.time类?

  • ThreeTenABP项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如ThreeTen-BackportHow to use ThreeTenABP…ThreeTen-ExtraInterval
  • © www.soinside.com 2019 - 2024. All rights reserved.