2012-02-28 734 views
1

我的程序需要将此日期表示为java.sql.date对象,但似乎当我创建新日期(使用日历)并将其设置为' 9999-12-31',最后将此java.util.date对象转换为java.sql.date对象,该日期转换为'000-01-31'。Java中日期31-12-9999的问题

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'已被某些客户端修复,所以它不能被更改,我的程序必须能够比较一些传入日期值与此。 有没有人知道为什么会发生这种情况,我知道http://en.wikipedia.org/wiki/Year_10,000_problem可能是9999年后的日期问题,但我应该安全一天。

编辑:正规化日期的方法只有“标准化给定日期的那一天的午夜”

private static java.util.Date normalizeDate(java.util.Date date) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(date); 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.SECOND, 0); 
    calendar.set(Calendar.MILLISECOND, 0); 
    date = calendar.getTime(); 

    return date; 
} 

但是,这样问题就出现在我被归之日起,我归它,企图修复这个。

+1

normalizeDate函数是做什么的? – Brigham 2012-02-28 14:38:54

+0

我会建议不要使用这样的“标记”日期。这是代表无关逻辑的脆弱方式。 – 2012-02-28 14:41:16

+0

@Rhhound正如我所指出的那样,它不是我自己选择的,这是我收到的一个需求规范的一部分。 – angryInsomniac 2012-02-28 14:44:33

回答

9

月份为零索引。 12月使用11,而不是12。这就是为什么你在一年中滚动。

+1

好吧,修好了!谢谢 ! 但为什么月份会被索引0?这是非常直观的! – angryInsomniac 2012-02-28 14:53:20

+5

不要使用11,使用Calendar.DECEMBER – mcfinnigan 2012-02-28 15:00:58

+2

这个类别中有两个愚蠢的特征:(a)月份是零索引,而月份的日期不是; (b)如果你输入了一个无效的值,那么这个类默默地展现出意外的行为,而不是抛出一个异常。日历只是一个稍微笨重的设计类。不要过分担心,但不要在自己的代码中模拟这种行为......! – 2012-02-28 15:00:59

0

检查持有这两个日期对象的小时,分​​钟,秒和毫秒。我相信他们是不同的。

如果您想比较日期(年,月,日),则只需要创建自定义Comparator并使用它。

+0

我刚刚用NormalizeDate()方法做了什么编辑。其基本功能是从这些日期删除所有时间相关的数据。 – angryInsomniac 2012-02-28 14:45:31

5

Calendar.MONTH是从零开始的。呼叫

calendar.set(9999, 12, 31); 

设置日期为“31天的第13个月的9999年的”,然后将其隐式转换为一年10000的第一个月它会导致一个异常,如果你第一次叫做

calendar.setLenient(false); 
+0

好吧,那修好了!谢谢 ! 但为什么月份会被索引0?这是非常直观的! – angryInsomniac 2012-02-28 14:53:34

+0

@angryInsomniac:我认为它是从C库继承而来的:http://www.cplusplus.com/reference/clibrary/ctime/tm/ – 2012-02-28 15:09:46