Настройка средств форматирования java.text для разных языков - PullRequest
5 голосов
/ 22 октября 2008

Создание Java-приложения, которое поддерживает разные локали, но хотело бы настроить отображение DateFormat сверх того, что доступно между параметрами FULL, LONG, MEDIUM и SHORT DateFormat. Хотелось бы сделать такие вещи, как поместить символ между датой и временем компонентов DateFormat.getDateTimeFormat (), строчные буквы AM / PM и т. Д., По крайней мере, для английского.

может придумать 3 способа сделать это:

1) если локаль английская, используйте мою строку пользовательского формата для нового объекта SimpleDateFormat.

2) изменить строки формата по умолчанию для существующих локалей

3) создайте новый вариант локали, который задает строки формата, которые я хочу

Не можете понять, как сделать 2 или 3 (или, если это вообще возможно), и не хотел бы делать 1 ... Кто-нибудь имел дело с чем-то подобным раньше?

также, кажется, 2 или 3 были бы необходимы для уменьшения AM / PM? (Указание ресурса AmPmMarkers для настроек формата даты локали)

Ответы [ 5 ]

1 голос
/ 23 октября 2008

Java имеет класс как раз для этого, это ResourceBundle Класс. Назад это с файлом свойств, и у вас есть все, что вам нужно, плюс еще.

Даже без класса ResourceBundle вы можете использовать свойства файлов для хранения всех форматов SimpleDateFormat.

Settings formats = new Settings();
Properties SDFFormats = formats.load(propertiesFile);

String SDFAmerica = SDFFormats.getProperty("FormatAmerica");

Хотя запись в файле свойств может выглядеть как

FormatAmerica = MMM-dd-yyyy
1 голос
/ 22 октября 2008

Почему бы вместо этого не использовать MessageFormat?

Используйте шаблон "{0, date, short} ваш текст здесь {0, time, short}", чтобы делать то, что вы хотите.

0 голосов
/ 23 октября 2008

Я рекомендую использовать Joda Time для форматирования даты. Он имеет мощную, но элегантную гибкость в форматировании. Вы, вероятно, обнаружите, что его средства форматирования делают то, что вы хотите сделать, чрезвычайно просто.

Кстати: когда ты уйдешь, Джода, ты никогда не вернешься!

0 голосов
/ 22 октября 2008

Наиболее удовлетворительный способ решения этой проблемы, который мы выяснили, - это загрузить Strings am, pm, formatString из пакета ресурсов, зависящего от локали, а затем:

SimpleDateFormat sdf = (SimpleDateFormat)sdf.getDateTimeInstance(DateTime.SHORT,DateTime.SHORT, locale);
if (formatString != null) {
    sdf = new SimpleDateFormat(formatString);
}
if (am!= null && pm != null) {
    DateFormatSymbols symbols = sdf.getDateFormatSymbols();
    symbols.setAmPmStrings(new String[]{am, pm});
    sdf.setDateFormatSymbols(symbols);
}

Пол: не уверен, что в DateFormatSymbols есть разделитель, хотя ... так что вам, вероятно, нужно сохранить str.replace

0 голосов
/ 22 октября 2008

Единственное, с чем я сталкивался, это тот факт, что strftime и locale говорят, что итальянский должен использовать двоеточия между полями времени, но Java ставит точки между ними. Поэтому я добавил следующий код:

  // This is an incredibly ugly hack, but it's based on the fact that
  // Java for some reason decided that Italy uses "." between
  // hours.minutes.seconds, even though "locale" and strftime say
  // something different.
      hmsTimeFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM);
      if (hmsTimeFormat instanceof SimpleDateFormat)
      {
        String str = ((SimpleDateFormat)hmsTimeFormat).toPattern();
        str = str.replace('.', ':');
        hmsTimeFormat = new SimpleDateFormat(str);
      }
...