【问题标题】:Java Date formatting issueJava日期格式问题
【发布时间】:2012-12-08 15:29:18
【问题描述】:

我正在尝试使用 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 库帮助我解决这个问题,我将不胜感激。

【问题讨论】:

  • 问题一定出在你电脑的时区(在你的电脑上看起来像UTC -5)。更多信息:What is the default timezone in java.util.Date
  • @LuiggiMendoza,你怎么知道他电脑上的默认 TZ 是什么?
  • @foampile 检查 OP 代码的第二个测试:它将在 0 毫秒内创建一个新的Date,打印它会给你31/Dec/1969 19:00:00。之后,获取 OP 的 pc 时区是基本的数学运算。
  • 很好,@LuiggiMendoza

标签: java date


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      其他答案正确但已过时。正如他们所提到的,java.util.Date 的许多不好的特性之一是它的toString 方法在生成日期时间值的字符串表示时静默应用您的 JVM 的当前默认时区。

      java.time

      Java 8 及更高版本带有 java.time 框架。对旧的 java.util.Date/.Calendar 的巨大 改进。

      UTC

      UTC 的时间线上暂时使用Instant 类。 java.time 有一个工厂方法ofEpochMilli,方便我们在此处使用自 1970 UTC 第一个时刻以来的毫秒数。但请注意,java.time 类具有更高的底层分辨率 nanoseconds 而不是毫秒。

      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 中的任何一个对象调整为a specific time zone。这会产生一个ZonedDateTime 对象。

      您的offset-from-UTC 似乎是-05:00。所以我将任意pick a time zoneAmerica/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[美国/牙买加]

      【讨论】:

        猜你喜欢
        • 2013-06-25
        • 2011-06-07
        • 2011-09-20
        • 2011-02-05
        相关资源
        最近更新 更多