Как автоматически локализовать формат даты в Java 8

Я просматривал библиотеку Date and Time в Java 8, и мне было интересно, есть ли способ отформатировать дату в локальном формате независимо от того, где запускается программа (например, с использованием локального формата региона, в котором установлен компьютер).

Библиотека даты и времени использует класс LocalDate для получения даты. При использовании LocalDate.now() по умолчанию используется формат гггг-ММ-дд.
Это можно отформатировать с помощью DateTimeFormatter следующим образом:

DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate date = LocalDate.now().format(dtFormatter);

К сожалению, это полностью зависит от шаблона, который я ввожу в методе ofPattern(pattern).
Существует также метод ofPattern(pattern, locale), который позволяет использовать локаль, однако использование следующего кода не форматирует, как хотелось бы, поскольку он не преобразует дата в американском формате MM-dd-yyyy:

DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy", Locale.US);
LocalDate date = LocalDate.now().format(dtFormatter);

Если бы это сработало, я бы попробовал использовать Locale.getDefault(). К сожалению, это ничего не меняет.

Итак, есть ли способ использовать библиотеку даты и времени Java 8 для преобразования даты в формат, используемый местоположением, в котором программа работает в данный момент. Например, если бы я был в США, я бы получил формат ММ-дд-гггг; но если бы языковой стандарт моего компьютера был установлен на Великобританию, дата была бы указана как дд-мм-гггг.

РЕДАКТИРОВАТЬ: я забыл упомянуть, я пробовал решение, данное на этот вопрос, однако это форматирует дату как dd/MM/yy, однако я бы предпочел, чтобы она была как dd-MM-yyyy. Я могу изменить каждый / на - с помощью replaceAll("/","-"), однако это не преобразует год из формата гг в формат гггг.


person JolonB    schedule 17.01.2019    source источник
comment
Java имеет предопределенные форматы в различные стили в зависимости от региона, но я не думаю, что существуют правила адаптации данного шаблона к любому региону. Вам придется определить их самостоятельно.   -  person shmosel    schedule 17.01.2019


Ответы (1)


Ваш поиск дал правильное решение:

    DateTimeFormatter dateFormatter
            = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
    System.out.println(LocalDate.now().format(dateFormatter));

Я установил для своей JVM локаль Locale.US, только что запустил этот код и получил:

17 января 2019 г.

Вы можете выбрать, насколько длинным или коротким форматом вы хотите. Если мы используем FormatStyle.SHORT вместо FormatStyle.MEDIUM, вы правы, мы получаем год только из двух цифр:

1/17/19

Дело именно в том, что он зависит от локали: в других локалях вы получите разные результаты, и, возможно, некоторые дадут вам четырехзначный год. Таким образом, вы можете считать это угловым случаем для США. Хотите ли вы сделать исключение в своем коде и специально обрабатывать локаль США — это зависит от того, насколько это важно для вас и ваших пользователей в США.

С одной стороны, в локализованные форматы была вложена некоторая работа, поэтому в большинстве случаев я склонен доверять им больше, чем своему собственному представлению о том, что, по моему мнению, предпочитают мои пользователи. С другой стороны, иногда могут быть особые соображения, которые диктуют, что встроенный локализованный формат не совсем подходит для конкретной ситуации. Когда имеет место последнее, это обычно имеет место в разных регионах. Моя интуиция подсказывает, что вы, возможно, не находитесь в такой ситуации, поэтому мое первое предложение: посмотрите, сможете ли вы жить со встроенным форматом SHORT или MEDIUM.

Редактировать: просто используйте FormatStyle.MEDIUM. Я только что заметил, что вы находитесь в Новой Зеландии. Поэтому вместо этого я установил для своей JVM локаль Locale.forLanguageTag("en-NZ"). Теперь с FormatStyle.SHORT я получаю 17/01/19, как вы сообщили. Но с FormatStyle.MEDIUM я получаю 17/01/2019, то есть год из четырех цифр, и в целом довольно близко к тому, что вы сказали, что хотели.

person Ole V.V.    schedule 17.01.2019
comment
Спасибо за это. Хотя она работает для Новой Зеландии, похоже, она не работает в других местах, например, в США, где она форматируется как 18 января 2019 года. В идеале эта программа должна работать где угодно и использовать локальный формат с двумя цифрами для дня. месяц и четыре цифры года. Я думаю, что я могу просто согласиться на двузначный год. Спасибо за вашу помощь! :) - person JolonB; 17.01.2019