Java Date 构造函数意外行为

标签 java date locale

我只是向 Date 的类构造函数提供值 2160000000(即 1000 * 60 * 60 * 24 * 25 - 仅 25 天)。我预计在这里会看到 1970-01-26 00:00:00,但我收到的是 1970-01-26 03:00:00(额外三个小时)!我还没有发现此构造函数也依赖于 JVM 区域设置的任何要点,我发现的只是关于闰秒的信息。但是闰秒不是同一年单个月份范围内的三个小时。但无论如何,我已经在测试方法中更改了默认语言环境(改为美国语言环境。我位于欧洲)只是为了实验,但没有任何改变。

我只是通过这个收到了这个(我之前已经解释过了,你知道的): 日期 date = new Date(1000* 60 * 60 * 24 * 25); (这仅用于示例目的)。我只使用调试器看到了实际值,仅此而已:

enter image description here

最佳答案

您得到了您期望的 DateDate 为 1970-01-26 00:00:00 UTC。这个时间点相当于 1970-01-26 03:00:00,UTC 偏移 +03:00。

在您的调试器中,您正在查看 Date 对象的私有(private)字段。这些没有为客户记录(这就是重点),所以不要指望任何特定的值。

我相信您会发现 Instant.ofEpochMilli(1000L * 60 * 60 * 24 * 25) 不那么令人困惑。或者更好,Instant.EPOCH.plus(Duration.ofDays(25))。 java.time 是现代 Java 日期和时间 API,使用起来更方便。如果您确实需要 Date 用于您现在不想更改的遗留 API,我建议先获取 Instant,然后使用 Date.from (yourInstant) 这样您就可以最大限度地减少对过时且令人困惑的 Date 类的使用(和依赖)。

最后,更改语言环境没有区别。虽然时区和 UTC 偏移量密切相关(在某种程度上有些人认为它们是相同的 :-),但语言环境与它们没有任何关系。相反,语言环境处理一组用户的语言和文化规范——它甚至不需要绑定(bind)到地理位置。

链接: All about java.util.Date

关于Java Date 构造函数意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49292421/

相关文章:

java - Thymeleaf 源 jar 中未定义空构造函数

java - 无法使用 Caffeine 创建简单缓存

java - 时间:确定系统显示12小时还是24小时

php - Spreadsheet_excel_reader 日期格式

java - 如何在 Java 中计算 "time ago"?

ruby-on-rails - 为什么在测试 Rails 3 时不能更改当前语言环境?

java - struts2 Web 应用程序中的 I18n 重定向问题

java - 我想当用户单击下一个播放按钮时停止当前播放的音频

java - 在 IntelliJ IDEA 中的上一行和下一行插入的快捷方式(使用 vim 的小 o 和大 O)

android - 更改区域设置但保持从左到右和其他电话方向