我有一个系统,我通过第三方lib获取日期。我知道输入的日期是1914-08-28,我不在乎小时和分钟。我需要将此日期发送给客户端,其格式应为1914-08-28T00:00。
我从第三方lib得到的是一个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时间与祖鲁时间不同。
对此有何解释?
答案 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.time
或Joda Time,两者都是更优越的日期/时间API ......