我正在尝试使用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”会导致打印正确的日期,但这似乎不是一个安全的解决方案。
如果需要所需的时区,则需要在格式化之前将timezone
设置为格式化程序。
使用dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
,然后呼叫dateFormat.format(date)
现代方法使用行业领先的java.time类。
解析为Instant
,UTC中具有纳秒分辨率的时刻。
long input = 1_427_590_800_000L ;
Instant instant = Instant.ofEpochMilli( input ) ;
生成标准ISO 8601格式的字符串。
String output = instant.toString() ;
2015-03-29T01:00:00Z
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,java.util.Date
和Calendar
。
要了解更多信息,请参见Calendar
。并在Stack Overflow中搜索许多示例和说明。规格为SimpleDateFormat
。
SimpleDateFormat
项目现在位于Oracle Tutorial中,建议迁移到JSR 310类。
您可以直接与数据库交换java.time对象。使用兼容Joda-Time或更高版本的maintenance mode。不需要字符串,不需要java.time类。
从哪里获取java.time类?
java.sql.*
,Java SE 8和更高版本-具有捆绑实施的标准Java API的一部分。Interval
。