java.time
Вот современный ответ. ИМХО в наши дни никто не должен бороться с давно устаревшими DateFormat
и SimpleDateFormat
классами. Их замена появилась в современном API даты и времени Java в начале 2014 года, java.time классы .
Я просто применяю идею из ответа Хаппира к современным классам.
Метод DateTimeFormatterBuilder.getLocalizedDateTimePattern
создает шаблон форматирования для стилей даты и времени для Locale
. Мы манипулируем результирующей строкой шаблона, чтобы заставить 4-значный год.
LocalDate date = LocalDate.of( 2017, Month.JULY, 18 );
String formatPattern =
DateTimeFormatterBuilder.getLocalizedDateTimePattern(
FormatStyle.SHORT,
null,
IsoChronology.INSTANCE,
userLocale);
formatPattern = formatPattern.replaceAll("\\byy\\b", "yyyy");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatPattern, userLocale);
String output = date.format(formatter);
Пример вывода:
- Для
Locale.US
: 7/18/2017
.
- Для каждого из
UK
, FRANCE
, GERMANY
и ITALY
: 18/07/2017
.
DateTimeFormatterBuilder
позволяет нам получить строку шаблона локализованного формата напрямую, без предварительного форматирования, это удобно здесь. Первый аргумент getLocalizedDateTimePattern()
- это стиль формата даты. null
в качестве второго аргумента указывает на то, что нам не нужен формат времени. В моем тесте я использовал LocalDate
для date
, но код должен работать и для других современных типов дат (LocalDateTime
, OffsetDateTime
и ZonedDateTime
).