Год относится к эпохе. Устанавливая год на значение, меньшее или равное 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"