1

我正在尝试使用 Java Date 类格式化一些日期。我有一些通过以前的计算得到的长值。在我开始格式化任何日期之前,我有一个长列表,它们如下所示。

-12345
0
12345

我做了一些这样的基本格式......

 DateFormat df = new SimpleDateFormat("dd/MMM/yyyy HH:mm:ss");
 String formattedDate = df.format(new Date(dateNumber.longValue())); 

因为 Java 使用 1970 年初作为基础,所以我的预期输出类似于

31/Dec/1969 23:59:47
01/Jan/1970 00:00:00
01/Jan/1970 00:00:12

但是我实际得到的输出是

31/Dec/1969 18:59:47
31/Dec/1969 19:00:00
31/Dec/1969 19:00:12

我有点困惑,为什么他们都在 12 月 31 日,而不是在 12 月 31 日和 1 月 1 日之间分开。由于列表中的后两个数字是正面的,我无法弄清楚为什么日期会在之前1970. 如果有人可以使用基本的 Java 库帮助我解决这个问题,我将不胜感激。

4

3 回答 3

3

您可以将数据格式对象的时区设置为 GMT:

df.setTimeZone(TimeZone.getTimeZone("GMT"));

你应该得到你想要的。时间戳表示“自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数”,对于您当前的时区,结果会有所不同。

于 2012-12-08T15:52:31.770 回答
1

您需要小心时区。看起来你是美国东部时间。日期假定为 UTC。当您打印时,您正在打印东部时间,因此您落后 5 小时。

于 2012-12-08T15:38:29.060 回答
0

其他答案是正确的但已过时。正如他们所提到的,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[美国/牙买加]

于 2016-01-05T02:41:44.300 回答