其他答案是正确的但已过时。正如他们所提到的,java.util.Date 的许多不好的特性之一是它的toString
方法在生成日期时间值的字符串表示时静默地应用您的 JVM 的当前默认时区。
java.time
Java 8 及更高版本带有 java.time 框架。对旧的 java.util.Date/.Calendar的巨大改进。
世界标准时间
在UTC的时间线上片刻,使用Instant
该类。java.time 有一个工厂方法ofEpochMilli
,方便我们在这里使用自 1970 UTC 第一时刻以来的毫秒数。但请注意,java.time 类的底层分辨率要高得多,为纳秒而不是毫秒。
Instant negative = Instant.ofEpochMilli ( - 12345L );
Instant zero = Instant.ofEpochMilli ( 0L );
Instant positive = Instant.ofEpochMilli ( 12345L );
转储到控制台。
System.out.println ( "negative: " + negative + " zero: " + zero + " positive: " + positive );
负:1969-12-31T23:59:47.655Z 零:1970-01-01T00:00:00Z 正:1970-01-01T00:00:12.345Z
在一个时区
我们可以将这些Instant
对象中的任何一个调整到特定的时区。这会产生一个ZonedDateTime
对象。
您的 UTC 偏移量似乎是-05:00
. 所以我会为那个偏移量任意选择一个时区。America/Jamaica
ZoneId zoneId = ZoneId.of ( "America/Jamaica" );
ZonedDateTime zdtNegative = ZonedDateTime.ofInstant ( negative, zoneId );
ZonedDateTime zdtZero = ZonedDateTime.ofInstant ( zero, zoneId );
ZonedDateTime zdtPositive = ZonedDateTime.ofInstant ( positive, zoneId );
转储到控制台。
System.out.println ( "zdtNegative: " + zdtNegative + " zdtZero: " + zdtZero + " zdtPositive: " + zdtPositive );
zdtNegative: 1969-12-31T18:59:47.655-05:00[America/Jamaica] zdtZero: 1969-12-31T19:00-05:00[America/Jamaica] zdtPositive: 1969-12-31T19:00:12.345- 05:00[美国/牙买加]