我遇到过这样一种情况,当从数据库(在 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_VALUE
和 Long.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)));
关于java - java.sql.Date 如何处理负日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35178106/