我有一个系统,我可以通过第三方库获取日期。我知道输入的日期是 1914-08-28,我不关心小时和分钟。我需要将此日期传递给客户,其格式应类似于 1914-08-28T00:00。
我从第三方库得到的是一个 java.util.Date,在调试时我偶然发现了一些对我来说看起来很奇怪的东西。
看看下面的图片。我有一个日期,当调用 toString()
时它返回 Thu Aug 27 22:00:00 CET 1914,但是当你查看包含的 cdate
看起来像是在祖鲁时代。
用 DateFormat 格式化它给我1914-08-27T00:00:
java.text.DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'00:00");
我真正期望的是我有一个祖鲁时间日期 (1914-08-27T22:00Z),相当于 1914-08-28T00:00 CET(第二天)。
这可以用下面的代码重现。
Calendar instance.set(1914, 7, 28, 22, 0);
instance.setTimeZone(TimeZone.getTimeZone("CET"));
Date d = instance.getTime();
现在 d
将显示 CET 时间,而 cdate(可见调试)将显示 Zulu 时间,但它们没有区别。如果使用默认时区,我希望 CET 时间与祖鲁时间不同。
这是什么原因?
最佳答案
java.util.Date
不在任何特定时区 - 它只是一个瞬间,在世界各地都有不同的本地时间。
在内部,它是自 Unix 纪元以来的毫秒数,但坦率地说,它可能是不同的表示...虽然我们通常将“Unix 纪元”视为 1970-01-01T00 :00:00Z,你同样可以认为是1970-01-01T01:00:00+01:00...它们代表同一个时间点。
从根本上说,不要再想着 java.util.Date
处于任何时区 - 它不是,而且 toString()
总是只使用系统默认时区,让很多开发者感到困惑。始终使用专用格式化程序(例如 SimpleDateFormat
)并指定您感兴趣的时区。
哦,最好改用 java.time
或 Joda Time ,两者都是更高级的日期/时间 API...
关于java - 解释 java.util.Date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25544586/