我尝试将日期值设置为具有默认值的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。
答案 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年。