Если у вас уже есть дата и время летом
Для меня работает форматирование 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);
Вывод такой же, как и раньше.