【问题标题】:Java Calendar set time to 12am of previous day in UTCJava Calendar 将时间设置为 UTC 前一天的凌晨 12 点
【发布时间】:2011-01-28 20:31:18
【问题描述】:

有人可以解释为什么或者如果这段代码是错误的吗?

// main
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(calendar.getTime());
calendar.add(Calendar.DATE, -1);
System.out.println(calendar.getTime());
calendar.set(Calendar.HOUR_OF_DAY, 0);
System.out.println(calendar.getTime());

它产生:

Fri Jan 28 15:27:35 EST 2011
Thu Jan 27 15:27:35 EST 2011
Wed Jan 26 19:27:35 EST 2011

我是否遗漏了一些明显的东西?我希望看到类似 Thu Jan 27 00:27:35 EST 2011

谢谢。

【问题讨论】:

  • 00:27:35 与将时间设置为 12am 有何相同之处?我希望上午 12 点是 00:00:00。

标签: java calendar utc


【解决方案1】:

您在默认时区打印它,而不是 UTC。虽然您的日历知道您感兴趣的时区,但getTime() 返回的java.util.Date 不知道...并且Date.toString() 使用系统时区。

鉴于您在主题中指定您希望 UTC 时间凌晨 12 点,您为什么希望看到 2011 年 1 月 27 日星期四 00:27:35 EST? EST 与 UTC 不同。

编辑:与往常一样,我只想指出Joda Time 通常是一个非常 更好的 API,可用于 Java 中的日期/时间算术。你目前得到了正确的答案,但我仍然建议搬到 Joda :)

【讨论】:

  • 好点。那么数学是否真的准确而我的输出是错误的?
【解决方案2】:

EST 是 UTC - 5 小时,因此 19:27 EST 对应于 00:27 UTC。对我来说这似乎是合乎逻辑的。 使用带有 UTC 区域设置的日期格式来显示您的日历,而不是使用您的默认区域设置。

【讨论】:

    【解决方案3】:

    对于 UTC 计算(仅限),您可能会发现使用 long 更简单。

    long time = System.currentTimeMillis();
    // yesterday at 12:00:00.000 am.
    long yesterday = (time / 86400000 - 1) * 86400000;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      相关资源
      最近更新 更多