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

pra*_*ezh 7 java time date long-integer

我有一种情况,当从数据库(in java.sql.Date)读取日期时,Java运行时返回了一些"反转"的毫秒值.毫秒值与天数大致相同,但从第0年开始倒数.

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

但是:我发现除了工作日之外,Java几乎正确处理这些"倒置"值.

当您运行以下代码时:

System.out.println(new java.util.Date(253402214400000l));
System.out.println(new java.util.Date(-377648784000000l));
Run Code Online (Sandbox Code Playgroud)

您将获得以下输出:

Fri Dec 31 01:00:00 CET 9999
Tue Dec 31 01:00:00 CET 9999
Run Code Online (Sandbox Code Playgroud)

另一个例子:

System.out.println(new java.util.Date(-294192000000l));
System.out.println(new java.util.Date(-123967324800000l));
Run Code Online (Sandbox Code Playgroud)

结果:

Mon Sep 05 01:00:00 CET 1960
Mon Sep 05 01:00:00 CET 1960
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我还没有找到关于这个"主题"的任何信息.

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

Rah*_*thi 1

当您在 Date 构造函数中传递负数时,它将被视为 1970 年 1 月 1 日之前的毫秒数。Javadoc

date - 自 1970 年 1 月 1 日 00:00:00 GMT 起的毫秒数,不超过 8099 年的毫秒表示。负数表示 1970 年 1 月 1 日之前的毫秒数,

您可以看到当您尝试在 Date 构造函数中提供Long.MIN_VALUEand时得到的结果。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)));
Run Code Online (Sandbox Code Playgroud)

IDEONE 演示