Gotchas
java.util.GregorianCalendar
имеет гораздо меньше ошибок и ошибок, чем
old java.util.Date
класс, но это еще не пикник.
Были ли программисты, когда летнее время было впервые
предложили, они бы наложили вето на это как на безумного и неразрешимого. С
летнее время, есть фундаментальная неопределенность. Осенью, когда
Вы устанавливаете свои часы назад на один час в 2 часа ночи, есть два разных
оба момента времени называются 1:30 утра по местному времени. Вы можете сказать им
только если вы записываете, планировали ли вы переход на летнее время или
Стандартное время с чтением.
К сожалению, GregorianCalendar
невозможно сказать, какой вы
предназначена. Вы должны обратиться к местному времени с манекеном
UTC TimeZone, чтобы избежать двусмысленности. Программисты обычно закрывают свои
глаза на эту проблему и просто надеюсь, что никто не делает ничего во время этого
час.
Ошибка тысячелетия. Ошибки все еще не из классов Календаря.
Даже в JDK (Java Development Kit) 1.3 есть ошибка 2001 года. Рассматривать
следующий код:
GregorianCalendar gc = new GregorianCalendar();
gc.setLenient( false );
/* Bug only manifests if lenient set false */
gc.set( 2001, 1, 1, 1, 0, 0 );
int year = gc.get ( Calendar.YEAR );
/* throws exception */
Ошибка исчезает в 7:00 2001/01/01 для MST.
GregorianCalendar
управляется гигантской кучей нетипизированных инт
магические константы. Эта техника полностью разрушает любую надежду на
проверка ошибок во время компиляции. Например, чтобы получить месяц, который вы используете
GregorianCalendar. get(Calendar.MONTH));
GregorianCalendar
имеет сырье
GregorianCalendar.get(Calendar.ZONE_OFFSET)
и летнее время
GregorianCalendar. get( Calendar. DST_OFFSET)
, но нет способа получить
фактическое смещение часового пояса используется. Вы должны получить эти два отдельно
и сложите их вместе.
GregorianCalendar.set( year, month, day, hour, minute)
не устанавливается
секунды до 0.
DateFormat
и GregorianCalendar
не работают должным образом. Вы должны
укажите Календарь дважды, один раз косвенно как Дата.
Если пользователь не настроил свой часовой пояс правильно, он будет по умолчанию
тихо в PST или GMT.
В GregorianCalendar месяцы нумеруются, начиная с января = 0,
а не 1, как все остальные на планете. Тем не менее, дни начинаются с 1
как и дни недели с воскресеньем = 1, понедельником = 2,… субботой = 7. Еще
Формат даты. синтаксический анализ ведет себя традиционным образом с января = 1.