Java日历将时间设置为UTC前一天的午夜12点

4
有人能解释一下为什么这段代码有问题吗?或者说它是否有问题?
// 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和将时间设置为上午12点有什么相同之处?我预期上午12点应该是00:00:00。 - Peter Lawrey
3个回答

3
你正在以默认时区而非UTC打印输出。尽管你的日历知道你感兴趣的时区,但是由getTime()返回的java.util.Date不知道,而Date.toString()使用系统时区。
考虑到你在主题中指定了想要UTC的12点,为什么你会期望看到Thu Jan 27 00:27:35 EST 2011?EST并不等同于UTC。
编辑:一如既往地,我想指出,在Java中进行日期/时间计算时,Joda Time通常是一个更好的API。你目前得到了正确的答案,但我仍然建议转向Joda :)

好的观点。那么数学上确实准确,只是我的输出有误吗? - Anon

2

东部标准时间(EST)比协调世界时(UTC)晚5个小时,因此19:27 EST对应于00:27 UTC。这在我看来很合理。 使用UTC语言环境的日期格式来显示您的日历,而不是使用默认的语言环境。


0

仅针对UTC计算,您可能会发现使用long更简单。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接