Строка формата на основе SimpleDateFormat и локали
Я пытаюсь отформатировать дату в Java по-разному на основе данного языка. Например, я хочу, чтобы английские пользователи видели "Nov 1, 2009 "(отформатированный" MMM d, yyyy") и норвежские пользователи видели " 1. ноябрь. 2009" ("д'. МММ. гггг").
часть месяца работает нормально, если я добавлю локаль в конструктор SimpleDateFormat, но как насчет остального?
Я надеялся, что смогу добавить строки формата в паре с локалями для SimpleDateFormat, но я не могу найти способ сделать это. Есть это возможно или мне нужно, чтобы мой код проверял языковой стандарт и добавлял соответствующую строку формата?
9 ответов:
использовать DateFormat.getDateInstance (int style, Locale locale) вместо того, чтобы создавать свои собственные шаблоны с
SimpleDateFormat
.
SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE dd MMM yyyy", Locale.ENGLISH); String formatted = dateFormat.format(the_date_you_want_here);
использовать стиль + язык: DateFormat.getDateInstance (int style, Locale locale)
проверить http://java.sun.com/j2se/1.5.0/docs/api/java/text/DateFormat.html
выполнить следующий пример, чтобы увидеть различия:
import java.text.DateFormat; import java.util.Date; import java.util.Locale; public class DateFormatDemoSO { public static void main(String args[]) { int style = DateFormat.MEDIUM; //Also try with style = DateFormat.FULL and DateFormat.SHORT Date date = new Date(); DateFormat df; df = DateFormat.getDateInstance(style, Locale.UK); System.out.println("United Kingdom: " + df.format(date)); df = DateFormat.getDateInstance(style, Locale.US); System.out.println("USA: " + df.format(date)); df = DateFormat.getDateInstance(style, Locale.FRANCE); System.out.println("France: " + df.format(date)); df = DateFormat.getDateInstance(style, Locale.ITALY); System.out.println("Italy: " + df.format(date)); df = DateFormat.getDateInstance(style, Locale.JAPAN); System.out.println("Japan: " + df.format(date)); } }
выход:
United Kingdom: 25-Sep-2017 USA: Sep 25, 2017 France: 25 sept. 2017 Italy: 25-set-2017 Japan: 2017/09/25
tl; dr
LocalDate.now().format( DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ) .withLocale( new Locale( "no" , "NO" ) ) )
хлопотные классы
java.util.Date
иSimpleDateFormat
теперь наследие, вытесненное java.время занятий.
LocalDate
The
LocalDate
класс представляет значение только для даты без времени суток и без часового пояса.часовой пояс имеет решающее значение в определении даты. Для любого данного момента, дата варьируется по всему миру по зонам. Например, через несколько минут после полуночи в Париж Франция это новый день, пока еще "вчера" в Квебека Монреале.
ZoneId z = ZoneId.of( "America/Montreal" ); LocalDate today = LocalDate.now( z );
DateTimeFormatter
использовать
DateTimeFormatter
для создания строк, представляющих только часть даты или часть времени.The
DateTimeFormatter
класс может автоматически локализация.для локализации, указать:
FormatStyle
чтобы определить, как долго или сокращенное если строка будет.Locale
определить (а) человеческий язык для перевода названия дня, названия месяца и т. д., И (Б) культурные нормы, решающие вопросы аббревиатуры, заглавной буквы, пунктуации и т. д.пример:
Locale l = Locale.CANADA_FRENCH ; DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l ); String output = ld.format( f );
идя в другом направлении, вы можете разобрать локализованную строку.
LocalDate ld = LocalDate.parse( input , f );
обратите внимание, что локаль и часовой пояс полностью ортогональны. Вы можете иметь Монреальский момент, представленный на японском языке, или Оклендский новозеландский момент, представленный на языке хинди.
другой пример: изменение
6 junio 2012
(испанский) в2012-06-06
(стандарт ISO 8601). Ява.классы времени используют форматы ISO 8601 по умолчанию для разбора / генерации строк.String input = "6 junio 2012"; Locale l = new Locale ( "es" , "ES" ); DateTimeFormatter f = DateTimeFormatter.ofPattern ( "d MMMM uuuu" , l ); LocalDate ld = LocalDate.parse ( input , f ); String output = ld.toString(); // 2012-06-06.
просмотр форматов
вот пример кода для просмотра результатов нескольких форматов в нескольких локалях, автоматически локализованный.
An
EnumSet
реализацияSet
, сильно оптимизированный как для низкого использования памяти, так и для быстрой скорости выполнения собираяEnum
объекты. Итак,EnumSet.allOf( FormatStyle.class )
дает нам коллекцию из всех четырехFormatStyle
перечисление объектов в цикле. Для получения дополнительной информации см. учебник Oracle по перечислению типов.LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ); List < Locale > locales = new ArrayList <>( 3 ); locales.add( Locale.CANADA_FRENCH ); locales.add( new Locale( "no" , "NO" ) ); locales.add( Locale.US ); // Or use all locales (almost 800 of them, for about 120K text results). // Locale[] locales = Locale.getAvailableLocales(); // All known locales. Almost 800 of them. for ( Locale locale : locales ) { System.out.println( "------| LOCALE: " + locale + " — " + locale.getDisplayName() + " |----------------------------------" + System.lineSeparator() ); for ( FormatStyle style : EnumSet.allOf( FormatStyle.class ) ) { DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( style ).withLocale( locale ); String output = ld.format( f ); System.out.println( output ); } System.out.println( "" ); } System.out.println( "« fin »" + System.lineSeparator() );
выход.
------| LOCALE: fr_CA — French (Canada) |---------------------------------- mardi 23 janvier 2018 23 janvier 2018 23 janv. 2018 18-01-23 ------| LOCALE: no_NO — Norwegian (Norway) |---------------------------------- tirsdag 23. januar 2018 23. januar 2018 23. jan. 2018 23.01.2018 ------| LOCALE: en_US — English (United States) |---------------------------------- Tuesday, January 23, 2018 January 23, 2018 Jan 23, 2018 1/23/18 « fin »
о java.время
The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как
java.util.Date
,Calendar
,&SimpleDateFormat
.The Joda-Time, теперь режим обслуживания, советует миграцию в java.время классы.
дополнительные сведения см. В разделе элемент Oracle Tutorial. Поиск переполнения стека для многих примеров и объяснений. Спецификация является JSR 310.
вы можете обменять java.время объекты непосредственно с вашей базой данных. Используйте - драйвера соответствуют JDBC 4.2 или позже. Нет необходимости в строках, нет необходимости в
java.sql.*
занятия.где получить java.время занятий?
- Java SE 8, Java SE 9, и позже
- встроенный.
- часть стандартного Java API с комплектной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- большая часть java.функциональность time обратно портирована на Java 6 & 7 в ThreeTen-Backport.
- Android
- более поздние версии Android bundle реализации java.время занятий.
- для более ранних Android, ThreeTenABP адаптируется ThreeTen-Backport (упоминалось выше). Смотрите как использовать ThreeTenABP....
The ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к java.время. Вы можете найти некоторые полезные классы, такие как
Interval
,YearWeek
,YearQuarter
, и больше.
локализация дата строка:
на основе сообщения redsonic:
private String localizeDate(String inputdate, Locale locale) { Date date = new Date(); SimpleDateFormat dateFormatCN = new SimpleDateFormat("dd-MMM-yyyy", locale); SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy"); try { date = dateFormat.parse(inputdate); } catch (ParseException e) { log.warn("Input date was not correct. Can not localize it."); return inputdate; } return dateFormatCN.format(date); } String localizedDate = localizeDate("05-Sep-2013", new Locale("zh","CN"));
будет как 05-九月-2013
это будет отображать дату в соответствии с текущей локали пользователя:
import java.text.DateFormat; import java.util.Date; Date date = new Date(); DateFormat df = DateFormat.getDateTimeInstance(); String myDate = df.format(date);
31 декабря 1969 7: 00: 02 PM
DateFormat.getDateInstance()
31 декабря, 1969
Java 8 стиль для данной даты
LocalDate today = LocalDate.of(1982, Month.AUGUST, 31); System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.ENGLISH))); System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.FRENCH))); System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.JAPANESE)));