java中日期为9999年12月31日的问题
我的程序需要将此日期表示为java.sql.date对象,但似乎当我创建一个新日期(使用日历)并将其设置为“9999-12-31”,最后将此java.util.date对象转换为java.sql.date对象时,此日期会转换为类似“000-01-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
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);