Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中日期为9999年12月31日的问题_Java - Fatal编程技术网

java中日期为9999年12月31日的问题

java中日期为9999年12月31日的问题,java,Java,我的程序需要将此日期表示为java.sql.date对象,但似乎当我创建一个新日期(使用日历)并将其设置为“9999-12-31”,最后将此java.util.date对象转换为java.sql.date对象时,此日期会转换为类似“000-01-31”的内容 Calendar calendar = Calendar.getInstance(); calendar.set(9999, 12, 31); infinityDate = new java.sql.Date(normalizeDate(c

我的程序需要将此日期表示为java.sql.date对象,但似乎当我创建一个新日期(使用日历)并将其设置为“9999-12-31”,最后将此java.util.date对象转换为java.sql.date对象时,此日期会转换为类似“000-01-31”的内容

Calendar calendar = Calendar.getInstance();
calendar.set(9999, 12, 31);
infinityDate = new java.sql.Date(normalizeDate(calendar.getTime()).getTime());
infinityDate应为31-12-9999 但当我的代码到达这里时:

if(otherDate.equals(infinityDate))
{// Do stuff}
它永远不会进入if条件,因为由于某种原因,infinityDate已更改为31-01-000,即使otherDate实际上是“31-12-9999”

otherDate是31-12-9999这一事实告诉我java可以表示这个日期,但由于某种原因,当我使用日历构造它时,它会更改日期。(otherDate来自从数据库获取数据的jdbc语句)

此参考日期“31-12-9999”已由某些客户端固定,因此无法更改,我的程序必须能够将一些传入日期值与此值进行比较。 有人知道为什么会发生这种情况吗?我意识到9999年以后的日期可能会有问题,但我应该安全一天

编辑:normalizedate方法仅“将给定日期标准化为当天午夜”


但是,这个问题是在我规范化日期之前出现的,为了解决这个问题,我对它进行了规范化。

检查保存在这两个日期对象中的小时、分钟、秒和毫秒。我相信他们是不同的


如果您只想比较日期(年、月、日),您可能应该创建自定义的
比较器并使用它

月份为零指数。12月份使用
11
,而不是
12
。这就是为什么要滚动一年。

日历月是以零为基础的。电话

calendar.set(9999, 12, 31);
将日期设置为“9999年第13个月的第31天”,然后隐式转换为10000年的第一个月。如果您首先调用

calendar.setLenient(false);

normalizeDate函数做什么?我建议不要使用这样的“标记”日期。这是一种表示无关逻辑的脆弱方式。@Ramhound正如我所指出的,这不是我的选择,这是我收到的需求规范的一部分。@angryInsomniac-我错过了那个信息。您是否100%确定数据库技术可以支持强制使用的日期值?你没有给我们提供足够的信息。你可能会考虑通知你的客户他们的参考日期有几个问题。@ RAMHAVEN我怎么没有提供足够的信息?在任何情况下,查询都已解决!是的,我确信数据库可以支持讨论中的日期。我刚刚用NormalizeDate()方法编辑了这个问题。它的基本功能是从这些日期中删除所有与时间相关的数据。好的,这就解决了它!谢谢但是为什么月份会被索引为0呢?这太违反直觉了!不要使用11,使用Calendar.December在这个类中有两个愚蠢的地方:(a)月份是零索引的,而月份的日期不是;(b) 如果输入的值无效,则类将以静默方式显示意外行为,而不是引发异常。Calendar只是一个设计有点笨拙的类。不要过分担心,但不要在自己的代码中模仿这种行为。。。!好的,这就解决了!谢谢但是为什么月份会被索引为0呢?这太违反直觉了@angryInsomniac:我认为它是从C库继承的:
calendar.setLenient(false);