Как получить название часового пояса для летнего времени, используя Java 8 - PullRequest
3 голосов
/ 20 апреля 2020

У меня есть ZonedDateTime (Java 8), и я хотел бы получить соответствующее сокращение часового пояса. Для сегодняшнего дня (20 апреля 2020 г.) и для часового пояса «Европа / Амстердам» это должно быть «CEST».

Вот соответствующий фрагмент из моего кода:

final ZoneId zoneId = ZoneId.of("Europe/Amsterdam");
final ZonedDateTime timestamp = ZonedDateTime.of(2020, 4, 20, 0, 0, 0, 0, zoneId);

System.out.println(zoneId.toString());
// OK: Prints “Europe/Amsterdam”

System.out.println(timestamp.getOffset().getId());
// OK: Prints “+02:00”

System.out.println(timestamp.getZone().getDisplayName(TextStyle.SHORT, Locale.ENGLISH));
// NOK: Prints “CET” instead of “CEST”

Есть намеки? Как я могу получить соответствующее сокращение часового пояса с переходом на летнее время?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Если у вас уже есть дата и время летом

Для меня работает форматирование ZonedDateTime в летнюю часть года с использованием средства форматирования с шаблоном форматирования zzz для краткости в летнее время (с учетом летнего времени) название часового пояса.

В первой части моего ответа я предполагаю, что либо вы уже знаете, что в Нидерландах летнее время 20 апреля, либо вы просто хотите правильное сокращение для этой даты, независимо от того, является ли это стандартным временем (CET) или летним временем (CEST).

    DateTimeFormatter zoneFormatter = DateTimeFormatter.ofPattern("zzz", Locale.forLanguageTag("nl"));
    final ZoneId zoneId = ZoneId.of("Europe/Amsterdam");
    final ZonedDateTime timestamp = ZonedDateTime.of(2020, 4, 20, 0, 0, 0, 0, zoneId);
    String output = timestamp.format(zoneFormatter);
    System.out.println(output);

Вывод:

CEST

Если вы не знаете, когда летнее время (DST) равно

Если вы хотите сокращение летнее время (DST) независимо от какой-либо конкретной даты и времени, либо оно немного сложнее чем можно было представить, или я что-то упускаю. Сначала я нахожу ZonedDateTime в летнее время года, затем форматирую его, как раньше.

Возможно, вы ожидали, что 1 июля в любом году сработает. Не так. Многие часовые пояса использовали летнее время в некоторые годы, а не в других. И часовые пояса в южном полушарии имеют свою зиму в июле, а летнее время года в противоположной части. Поэтому для решения, которое работает в разных часовых поясах, нам нужно найти летнее время программно. Я использую для этого правила часового пояса.

    DateTimeFormatter zoneFormatter = DateTimeFormatter.ofPattern("zzz", Locale.forLanguageTag("nl"));
    ZoneId zone = ZoneId.of("Europe/Amsterdam");

    // Find a time where summer time (DST) is in effect (if there is one)
    ZoneRules rules = zone.getRules();
    Optional<Instant> exampleTime = rules.getTransitions()
            .stream()
            .map(ZoneOffsetTransition::getInstant)
            .filter(i -> ! rules.getDaylightSavings(i).equals(Duration.ZERO))
            .findAny();

    // Format the time found into a zone abbreviation
    String output = exampleTime.map(t -> t.atZone(zone))
            .map(zoneFormatter::format)
            .orElse("No summer time found");

    System.out.println(output);

Вывод такой же, как и раньше.

0 голосов
/ 20 апреля 2020

Вы можете использовать TimeZone Class вместо ZonedDateTime следующим образом:

TimeZone timeZone = TimeZone.getTimeZone("Europe/Amsterdam");
System.out.println(timeZone.getDisplayName(true, 0));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...