Почему GregorianCalendar.getInstance содержит Calsys и cdate типа юлианского календаря

StackOverflow https://stackoverflow.com/questions/1536148

Вопрос

Я пытался установить значение даты для ReadedStatement со значением по умолчанию, но иногда это значение возвращается как 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.

Это было полезно?

Решение

Какую версию 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 для второй даты:

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top