为什么GregorianCalendar.getInstance包含一个类型为Julian Calendar的calsys和cdate

时间:2009-10-08 07:26:45

标签: java date gregorian-calendar julian-date

我尝试将日期值设置为具有默认值的PreparedStatement,但该值有时会返回为JulianValue。例如(假设spanBegin和spanEnd为空)

Calendar cal = new GregorianCalendar();
if (spanBegin == null) {
    cal.set(0000, Calendar.JANUARY, 1);
    spanBegin = cal.getTime();
}

if (spanEnd == null)
{
    cal.set(9999, Calendar.DECEMBER, 31);
    spanEnd = cal.getTime();
}

在第3行,从1月1日开始,0000由Julian日历作为范围,CDate成为Julian日历。然而,即使它是在9999年,下一个日期,其CDate仍然成​​为朱利安日历。我不得不创建另一个Gregorian Calendar实例来解决这个问题。

Calendar cal = new GregorianCalendar();
if (spanBegin == null) {
    cal.set(0000, Calendar.JANUARY, 1);
    spanBegin = cal.getTime();
}

Calendar cal = new GregorianCalendar();
if (spanEnd == null)
{
    cal.set(9999, Calendar.DECEMBER, 31);
    spanEnd = cal.getTime();
}

问题是,这是预期的行为还是日期对象上的错误?实际上使用GregorianCalendar.getInstance()表明有时将cdate设置为JulianCalendar。

3 个答案:

答案 0 :(得分:2)

直到1582年才有格里高利历。朱利安日历在整个欧洲都在使用,直到太阳年不是365.25天,而不是那么少,因此开始出现小问题。为了解决问题,教皇Gregory XIII下令将日历更改为我们今天所知的 - 每年除以100不是闰年,除非它除以400.在1582年10月有过渡 - 第4天10月15日是10月15日。这意味着直到1582年10月,格里高利和朱利安日历都是一样的。您可以阅读更多相关信息here

这就是为什么1582年10月之前的日期转换为使用朱利安系统的原因。根据{{​​3}}如果你真的需要代表一个历史事件(这似乎不是这里的情况)你只能从3月1日,4AD

答案 1 :(得分:1)

您使用的是什么版本的Java以及什么操作系统?你真的需要在0和9999年存储日期,或者你只是将它们用作“负无穷大”和“正无限”值?你究竟怎么看日历是朱利安日历?

我试过了:

Calendar cal = Calendar.getInstance();

cal.set(0, Calendar.JANUARY, 1);
Date d1 = cal.getTime();

cal.set(9999, Calendar.DECEMBER, 31);
Date d2 = cal.getTime();

System.out.println(d1);
System.out.println(d2);

输出(在Windows XP上,使用Sun Java 1.6.0_16):

Thu Jan 01 09:53:56 CET 1 java.util.Date
Tue Dec 31 09:53:56 CET 9999 java.util.Date

它将第0年更改为第1年。更改代码以使用第二个日历对象作为第二个日期:

Calendar cal = Calendar.getInstance();

cal.set(0, Calendar.JANUARY, 1);
Date d1 = cal.getTime();

Calendar cal2 = Calendar.getInstance();
cal2.set(9999, Calendar.DECEMBER, 31);
Date d2 = cal2.getTime();

System.out.println(d1);
System.out.println(d2);

这不会改变输出或两个Date对象的内容。

注意:请注意,在代码中以0开头的整数文字(如0000)将被Java编译器解释为八进制数。在这种情况下,这并不重要,因为数字是0,但是如果不将它们表示为八进制数,则不应在整数文字前加零。

答案 2 :(得分:1)

朱利安历法中没有第0年。它从公元前1年到公元1年。