Почему GregorianCalendar.getInstance содержит calsys и cdate типа Юлианский календарь - PullRequest
2 голосов
/ 08 октября 2009

Я пытался установить значение даты в 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 января 0000 определяется юлианским календарем, CDate становится юлианским календарем. Тем не менее, следующая дата, даже если она в 9999 году, ее CDate все равно становится юлианским календарем. Мне пришлось создать еще один экземпляр григорианского календаря, чтобы решить эту проблему.

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 ]

2 голосов
/ 08 октября 2009

До 1582 года не было григорианского календаря. Юлианский календарь использовался по всей Европе, пока не начали появляться незначительные проблемы, вызванные тем, что солнечный год не точно 365,25 дней, но немного меньше этого. Чтобы исправить положение, папа Григорий XIII приказал изменить календарь на то, что мы знаем сегодня - каждый год, который делится на 100, не является високосным, если только он не делится на 400. В октябре 1582 года произошел переход - день после 4 Октябрь был 15 октября. Это означает, что до октября 1582 года григорианский и юлианский календари были одинаковыми. Вы можете прочитать больше об этом здесь

Вот почему даты до 1582 года конвертируются для использования юлианской системы. В соответствии с API Если вам действительно нужно представить историческое событие (что, как кажется, здесь не так), вы можете сделать это только с 1 марта, 4AD

1 голос
/ 08 октября 2009

В юлианском календаре нет года 0. Это идет от 1 до н.э до 1 нашей эры.

1 голос
/ 08 октября 2009

Какую версию 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, но вы не должны ставить перед целыми литералами нули, если вы не подразумеваете их как восьмеричные числа.

...