Как отобразить правильный локализованный формат DateTime? - PullRequest
0 голосов
/ 23 февраля 2019

Я пишу программу JavaFx, которая показывает формат времени и даты Windows.Это означает, что когда я меняю язык Windows, программа должна показывать новый формат времени и даты.Например, в некоторых местах формат времени выглядит следующим образом:

30.12.2018

, а в других местах он отображается следующим образом:

12.30.2018

Я пытался с классом LocalDateTime в Java, но это не имеет смысла, потому что у этого класса нет информации о часовом поясе.

private void init()
{
    button = new Button("Update");
    button.setFont(Font.font(null,FontWeight.BOLD,15));
    setBottom(button);
    setAlignment(button, Pos.CENTER);
    setPadding(new Insets(15));

    ldt = LocalDateTime.now();
    label = new Label();
    label.setFont(Font.font(null, FontWeight.BOLD,20));
    label.setTextFill(Color.RED);
    label.setAlignment(Pos.CENTER);

    text = ldt.toString();
    label.setText(text);

    gridPane = new GridPane();
    gridPane.add(label, 0, 0);
    gridPane.setAlignment(Pos.CENTER);
    setCenter(gridPane);        
}

Немецкий:

enter image description here

Английский:

enter image description here

Как правильно отобразить это?

1 Ответ

0 голосов
/ 24 февраля 2019

Неправильный класс: LocalDateTime

Никогда не используйте LocalDateTime для отслеживания фактического момента. Не имея понятия часового пояса или смещения от UTC, LocalDateTime не можетпредставлять момент.LocalDateTime может знать «полдень 23 января 2019 года», но не знает, если вы имеете в виду полдень в Токио, Япония, полдень в Тунисе Тунис или полдень в Монреале-Квебеке - три совершенно разных момента,каждый разделен на несколько часов.

Слово «Локальный» в LocalDateTime означает любой населенный пункт или каждый населенный пункт.Но это не означает какую-то одну конкретную местность.

Правильный класс: ZonedDateTime

Для отслеживания моментов используйте Instant (всегда в UTC) или ZonedDateTime (или, возможно, OffsetDateTime).

Укажите собственное имя часового пояса в формате Continent/Region, например America/Montreal, Africa/Casablanca или Pacific/Auckland.Никогда не используйте 2-4 буквенные сокращения, такие как EST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
ZonedDateTime zdt = ZonedDateTime.now( z ) ; // Capture the current moment as seen through the wall-clock time used by the people of a particular region (a time zone). 
Instant instant = zdt.toInstant() ;  // Adjust from a zone to UTC, if needed. An `Instant` is always in UTC by definition. 

Если часовой пояс не указан, JVM неявно применяет свой текущий часовой пояс по умолчанию.Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться.Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента.Если критично, подтвердите зону с вашим пользователем.

Автоматическая локализация

Класс DateTimeFormatter может автоматически локализоваться при генерации текста, представляющего значение объекта даты-времени.

Для локализации укажите:

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

Пример:

Locale l = Locale.CANADA_FRENCH ;   // Or Locale.US, Locale.JAPAN, etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL )
                                       .withLocale( l );
String output = zdt.format( f );

Уточните, что языковой стандарт и часовой пояс не имеют ничего делать друг с другом - ортогональные вопросы.Инженер из Квебека, участвующий в конференции в Индии, может захотеть увидеть расписание событий, представленное на ее родном французском языке, с канадскими культурными нормами и с указанием даты и времени в местном индийском часовом поясе.


About java.time

Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time классы.

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...