Календарь установлен ГОД выпуска - PullRequest
11 голосов
/ 25 ноября 2011

Я попробовал следующий фрагмент кода:

Calendar c1 = Calendar.getInstance();
c1.set(Calendar.YEAR, 0);
c1.set(Calendar.DAY_OF_YEAR, 1);
Date d1 = c1.getTime();

Calendar c2 = Calendar.getInstance();
c2.setTime(d1);
c2.set(Calendar.YEAR, 2001);
c2.set(Calendar.DAY_OF_YEAR, 1);
System.out.println(c2.getTime().toString());

Calendar c3 = Calendar.getInstance();
c3.set(Calendar.YEAR, 2000);
c3.set(Calendar.DAY_OF_YEAR, 1);
Date d2 = c3.getTime();

Calendar c4 = Calendar.getInstance();
c4.setTime(d2);
c4.set(Calendar.YEAR, 2001);
c4.set(Calendar.DAY_OF_YEAR, 1);
System.out.println(c4.getTime().toString());

Результат:

Wed Jan 01 23:47:00 CET 2001
Mon Jan 01 23:47:00 CET 2001

Что не так? Разве я не должен использовать Календарь таким образом для установки ГОДА?

Ответы [ 2 ]

15 голосов
/ 16 августа 2012

Год относится к эпохе. Устанавливая год на значение, меньшее или равное 0, календарь автоматически исправляет это, переключая эру (с AD на BC или с BC на AD). Это поведение лучше известно из других областей. Например. если вы установите месяц на что-то отрицательное, год соответственно уменьшится.

Эти исправления вносятся не индивидуально, а скорее сразу, обычно, когда вы звоните getTime(), чтобы прочитать итоговую дату.

Calendar c1 = Calendar.getInstance(); // August  16th, 2012 AD
c1.set(Calendar.YEAR, 0);             // August  16th,    0 AD
c1.set(Calendar.DAY_OF_YEAR, 1);      // January  1st,    0 AD
Date d1 = c1.getTime();               // January  1st,    1 BC (corrected)

Calendar c2 = Calendar.getInstance();
c2.setTime(d1);
c2.set(Calendar.YEAR, 2001);          // January  1st, 2001 BC
c2.set(Calendar.DAY_OF_YEAR, 1);
System.out.println(c2.getTime());     // prints "Wed Jan 01 05:35:00 CET 2001"
                                      // because 01/01/2001 BC was a Wednesday

Таким образом, вместо того, чтобы установить год на 2001, вы должны будете установить его на -2000 (потому что год 0 вообще не существует). Или вы можете явно установить эпоху:

c2.set(Calendar.ERA, GregorianCalendar.AD);

Другой способ устранить эту «ошибку» - это , а не , считывающий время до полной даты:

Calendar c1 = Calendar.getInstance(); // August  16th, 2012 AD
c1.set(Calendar.YEAR, 0);             // August  16th,    0 AD
c1.set(Calendar.DAY_OF_YEAR, 1);      // January  1st,    0 AD
c1.set(Calendar.YEAR, 2001);          // January  1st, 2001 AD
System.out.println(c1.getTime());     // prints the expected date

Для вывода эры даты вы можете использовать «G» в шаблоне SimpleDateFormat:

new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy G").format(c2.getTime())
// "Wed Jan 01 05:35:00 CET 2001 BC"
3 голосов
/ 25 ноября 2011

В обоих случаях непосредственно перед печатью выходных данных вы устанавливаете 2001 год. В обоих случаях выходные данные отражают этот год.Вы ожидали другого выхода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...