我遇到过这样的情况:当从数据库读取日期时,Java 运行时返回某种“反转”毫秒值(在java.sql.Date
)。毫秒值与天数大致相同,但从 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));
Result:
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 构造函数中传递负数时,它将被视为 1970 年 1 月 1 日之前的毫秒数。这Javadoc http://docs.oracle.com/javase/7/docs/api/java/sql/Date.html#setTime(long says:
日期 - 自 1970 年 1 月 1 日 00:00:00 GMT 起的毫秒数,不超过
8099 年的毫秒表示。负数
表示1970年1月1日之前的毫秒数,
当您尝试提供以下内容时,您可以看到得到的结果Long.MIN_VALUE
and 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)));
IDEONE 演示 https://ideone.com/fzEOm5
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)