Как получить шаблон даты из часового пояса локали в Java - PullRequest
6 голосов
/ 05 октября 2011

У меня есть часовой пояс и локаль пользователя. Теперь я хочу получить шаблон даты.

Например: часовой пояс пользователя PST и языковой стандарт США, а шаблон, который я ожидаю, - «ММ / дд / гггг», а если часовой пояс пользователя - IST и языковой стандарт Индии, то шаблон, который я ожидаю, - «дд / мм / гггг»

Как это получить?

Примечание. Я хочу получить шаблон, а не фактическую дату, чтобы использовать его в другом месте.

Ответы [ 5 ]

3 голосов
/ 05 октября 2011

Логика, переводящая Locale в форматы даты / времени, скрыта в конструкторе java.text.SimpleDateFormat#SimpleDateFormat, точно в sun.util.resources.LocaleData#getDateFormatData. Этот метод предоставляет ResourceBundle, который затем запрашивается для конкретного шаблона в зависимости от того, какой стиль был выбран.

Другими словами - к сожалению, JDK не предоставляет API / SPI для доступа к необработанным форматам. Мой совет - все время использовать Locale и передавать его методам форматирования / разбора.

1 голос
/ 05 октября 2011

Действительно ли вам нужен TZ для шаблона даты? Обычным способом является наличие шаблона данных в файле локализованных свойств для локали (или locale_country). Я думаю, что этого достаточно.

0 голосов
/ 24 апреля 2013

Если вы используете Joda Time (а почему бы и нет, если у вас есть какой-либо выбор? Он почти включен в JDK 1.7), вы можете сделать что-то вроде этого:

String patternForStyleAndLocale = org.joda.time.format.DateTimeFormat.patternForStyle("S-", locale);

Что, к сожалению, толькодает двузначный год.Один из способов обойти это:

if (!org.apache.commons.lang.StringUtils.contains(patternForStyleAndLocale, "yyyy"))
{
    // The default Joda pattern only has a two digit year for US and Europe, China etc - but we want four digit years
    patternForStyleAndLocale = StringUtils.replace(patternForStyleAndLocale, "yy", "yyyy");
}

И вы можете рассмотреть их кэширование в ConcurrentHashMap<Locale, String>.

Приятная вещь в получении числовой даты в виде предварительно локализованного шаблона, напримерэто то, что он не требует дальнейшей локализации позже, как если бы вы использовали шаблон, такой как:

"dd MMM yyyy" // UK: "25 Dec 2010" FRANCE: "25 déc. 2010" etc..

Однако ... Я только что заметил из вашегопозже прокомментируйте, что вы хотите передать шаблон в JavaScript - это может быть очень сложно, поскольку JS использует другое форматирование шаблонов для Java (например, дата ISO - "yyyy-MM-dd" в Java и "yy-mm-dd" в JS).Я не пытался решить эту проблему, но я бы, вероятно, использовал некоторое отображение строк в JS или Java, чтобы просто отобразить шаблоны Java в JS.Разумеется, вам необходимо заранее знать каждый из шаблонов, с которыми вы можете столкнуться для каждого из языков.

0 голосов
/ 05 октября 2011

вы можете использовать Карта интерфейса

k будет Locale, v будет строкой с шаблоном даты

0 голосов
/ 05 октября 2011

Похоже, вы хотите статические getInstance методы на DateFormat. Они принимают целочисленную константу для стиля (короткая, длинная и т. Д.) И, необязательно, другой языковой стандарт (вместо значения по умолчанию для JVM).

...