解释java.util.Date

时间:2014-08-28 08:49:45

标签: java date datetime

我有一个系统,我通过第三方lib获取日期。我知道输入的日期是1914-08-28,我不在乎小时和分钟。我需要将此日期发送给客户端,其格式应为1914-08-28T00:00。

我从第三方lib得到的是一个java.util.Date,在调试的过程中,我发现了一些看起来很奇怪的东西。
看看下面的图片。我有一个日期,当他致电toString()时,它会返回 Thu Aug 27 22:00:00 CET 1914 ,但当你看到包含的cdate时,它看起来像是在祖鲁时间。

enter image description here

使用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时间与祖鲁时间不同。

对此有何解释?

1 个答案:

答案 0 :(得分:6)

java.util.Date不在任何特定的时区 - 它只是一个瞬间,它将在世界各地有不同的当地时间。

在内部,自Unix时代以来它已经过了几毫秒,但坦率地说它可能是一个不同的代表......虽然我们通常认为“Unix时代”是1970-01-01T00 :00:00Z,您可以将其视为1970-01-01T01:00:00 + 01:00 ......它们代表的是同一时间点。

从根本上说,不要再考虑java.util.Date处于任何时区 - 它不是,toString()总是只使用系统默认时区,让许多开发人员感到困惑。始终使用专用格式化程序(例如SimpleDateFormat)并指定您感兴趣的时区。

哦,理想情况下转向使用java.timeJoda Time,两者都是更优越的日期/时间API ......