java - 解释 java.util.Date

标签 java date datetime

我有一个系统,我可以通过第三方库获取日期。我知道输入的日期是 1914-08-28,我不关心小时和分钟。我需要将此日期传递给客户,其格式应类似于 1914-08-28T00:00。

我从第三方库得到的是一个 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 时间与祖鲁时间不同。

这是什么原因?

最佳答案

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...

关于java - 解释 java.util.Date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25544586/

相关文章:

java - Android 美国各州数据提供商

java - 创建 web 应用程序的最佳方法,该应用程序通过外部客户端调用自己的其余服务来动态更新 UI

java - “JavaPackage”对象不可调用

python - 获取python中两个日期之间的所有年份

oracle - 从Grails-Groovy中提取Oracle vs MySQL中的时间戳字段

java - 尝试在 Android 上从解析和查看中调用图片

delphi - Delphi 7 和 Delphi XE4 中的默认日期格式

MySQL 允许保存无效日期

javascript - 转换 2014-11-03T00 :00:00 to yyyy-mm-dd in javascript

mysql - 日期时间到整数