java - java.sql.Date 如何处理负日期?

标签 java date time long-integer

我遇到过这样一种情况,当从数据库(在 java.sql.Date 中)读取日期时,Java 运行时返回某种“倒置”的毫秒值。毫秒值与天数大致相同,但从 0 年开始倒数。

只需重新启动 Java 运行时即可解决问题。

但是:我发现 Java 几乎可以正确处理这些“倒置”值,除了工作日。

当您运行以下代码时:

System.out.println(new java.util.Date(253402214400000l));
System.out.println(new java.util.Date(-377648784000000l));

您将获得以下输出:

Fri Dec 31 01:00:00 CET 9999
Tue Dec 31 01:00:00 CET 9999

另一个例子:

System.out.println(new java.util.Date(-294192000000l));
System.out.println(new java.util.Date(-123967324800000l));

结果:

Mon Sep 05 01:00:00 CET 1960
Mon Sep 05 01:00:00 CET 1960

使用在线转换器时,特定第二行的结果会有所不同。这将导致接近真实的正日期的负日期(年份为负):

Example1:
253402214400000 = Fri Dec 31 9999 01:00:00
-377648784000000 = Tue Oct 15 -9998 02:00:00

Example 2:
-294192000000 = Mon Sep 05 1960 02:00:00
-123967324800000 = Mon Aug 19 -1959 02:00:00

我还没有找到关于这个“主题”的任何信息。

那么,“倒置”日期背后的神话是什么?为什么 Java 几乎可以正确地处理它们? JDBC ResultSet 在调用 resultSet.getDate(1).getTime() 时返回“反转”毫秒值有什么意义?

最佳答案

当您在 Date 构造函数中传递一个负数时,它被视为 1/1/1970 之前的毫秒数。 Javadoc说:

date - milliseconds since January 1, 1970, 00:00:00 GMT not to exceed the milliseconds representation for the year 8099. A negative number indicates the number of milliseconds before January 1, 1970,

您可以看到当您尝试在 Date 构造函数中提供 Long.MIN_VALUELong.MAX_VALUE 时得到的结果。

DateFormat df = new SimpleDateFormat("d MMM yyyy G, HH:mm:ss.S Z");
System.out.println(df.format(new Date(Long.MIN_VALUE)));
System.out.println(df.format(new Date(Long.MAX_VALUE)));

Ideone Demo

关于java - java.sql.Date 如何处理负日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35178106/

相关文章:

JavaFX:如何创建带有通知徽章的应用程序图标?

java - 目标 org.jvnet.jax-ws-commons :jaxws-maven-plugin:2. 3:wsgen 的执行失败

java - 什么时候应该在 Java 8 中使用 Supplier?

javascript - 补偿 Moment.js 中的 utcOffset

javascript - 为什么 getDate() 有一个月的时间?

mysql - SQL where 两个时间列之间的两个时间值

java - 更改输入特定值时的背景颜色(jNumberField)

time - Google Analytics(分析):如何为尺寸添加“秒”?

java - Android 应用程序中的穆斯林祈祷时间是如何计算的?

sql - 按星期几按小时计算的平均计数