Интернационализация. Форматирование даты и времени.

При форматировании даты и времени в соответствии с региональными стандартами следует иметь в виду четыре особенности:
  • названия месяцев и дней недели должны быть представлены на местном языке;
  • последовательность указания года, месяца и числа различаются для разных стран и регионов;
  • для отображения дат можно использовать календарь, отличный от григорианского;
  • следует учитывать часовые пояса.
Для учета перечисленных возможносте в Java имеется класс DateFormat, который используется почти также, как и класс NumberFormat. В первую очередь следует сформировать объект регионального стандарта. Для получения массива региональных стандартов, поддерживающих формат даты, можно использовать предлагаемый по умолчанию статический метод getAvailableLocales (). Далее необходимо вызвать один из трех фабричных методов:
  
  fmt = DateFormat.getDateInstance (dateStyle, loc);
  fmt = DateFormat.getTimeInstance (timeStyle, loc);
  fmt = DateFormat.getDateTimeInstance (dateStyle, timeStyle, loc);

Для указания нужного стиля предусмотрен параметр, в качестве которого задается одна из следующих констант:

  DateFormat.DEFAULT; 
  DateFormat.FULL (например, Wednesday, Septemer 15 2004, 8:15:03 pm PDT для регионального стандарта США) 
  DateFormat.LONG (например, Septemer 15, 2004 8:15:03 pm PDT для регионального стандарта США) 
  DateFormat.MEDIUM (например, Sep 15, 2004 8:15:03 pm для регионального стандарта США) 
  DateFormat.SHORT (например, 9/15/04 8:15 pm для регионального стандарта США) 

Представленные выше фабричные методы возвращают объект, который можно использовать для форматирования даты.

  Date date = new Date (); 
  String s = fmt.format (date); 

Для преобразования строки в дату используется метод parse (), который работает аналогично одноименному методу класса NumberFormat. Например, приведенный ниже код преобразует строку, введенную пользователем в поле редактирования; при этом учитываются региональный настройки по умолчанию:

  TextField inputField; 
  . . . 
  DateFormat fmt = DateFormat.getDateInstance (DateFormat.MEDIUM); 
  Date input = fmt.parse (inputField.getText ().trim ()); 

В случае некорректного ввода даты попытка преобразования приведет к генерации исключения ParseException (). Следует отметить, что в начале строки, подлежащей преобразованию в дату также не допускаются пробелы. Для их удаления следует вызвать метод trim (). Любые символы, котрые располагаются после даты, игнорируются. К сожалению, пользователь должен вводить дату в конкретном формате. Например, если установлен тип представления даты MEDIUM в региональном стандарте США, то предполагается, что введенная строка должна иметь вид Sep 18, 1997. Но если пользователь введет строку Sep 18 1997 (без запятой) или 9/18/97 (в кратком формате), то это приведет к ошибке преобразования.

Для интерпретации неточно указанных дат предусмотрен флаг lenient. Если данный флаг установлен, то неверно заданная дата February 30, 1999 будет автоматически преобразована в дату March 2, 1999. Такое поведение вряд ли можно считать безопасным, поэтому данный флаг следует отключить. В этом случае, при попытке пользователя ввести некорректное сочетание дня, месяца и года во время преобразования строки в дату будет сгенерировано исключение IllegalArgumetException.