Java 8 получает часовой пояс из zonedLocalTime

Я пишу вспомогательный метод, который принимает строковое представление даты и возвращает TimeZone.

Например:

input: 2017-11-02T09:30:00-07:00
output : "America/Los_Angeles"

(Здесь ввод PST. Я использую смещение UTC -7:00)

Here is my method
 public static String getTimeZone(final String date) {
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(date, DateTimeFormatter.ISO_DATE_TIME);

        String timezone = TimeZone.getTimeZone(zonedDateTime.getZone()).getAvailableIDs()[0];
        System.out.println(timezone);
        return timezone;
    }

когда я передаю указанную выше дату, я получаю Africa/Abidjan, что совершенно неверно.

Я предпочитаю "Америка/Лос-Анджелес", но по крайней мере что-то правильное. Здесь то, что я получаю, совершенно неверно в том смысле, что время в Абиджане и Лос-Анджелесе сильно отличается.

как правильно сюда добраться?


person brain storm    schedule 04.11.2017    source источник
comment
Что-то пошло не так в этой ветке. Когда вы можете использовать современный API даты и времени Java (включая ZonedDateTime), я твердо убежден, что нет смысла также использовать устаревший класс TimeZone. Предпочитаю современный ZoneId. Его статический метод getAvailableZoneIds даст вам доступные часовые пояса.   -  person Ole V.V.    schedule 07.11.2017


Ответы (2)


Вот мое предложение:

public static String getTimeZone(final String date) {
    final ZonedDateTime zonedDateTime = ZonedDateTime.parse(date,DateTimeFormatter.ISO_DATE_TIME);
    final TimeZone timeZone = TimeZone.getTimeZone(zonedDateTime.getZone());
    return  Arrays.stream(TimeZone.getAvailableIDs(timeZone.getRawOffset())).peek(System.out::println).findFirst().get();
}

Здесь вывод

//America/Boise
person Aguid    schedule 04.11.2017
comment
почему Бойсе? Я ожидаю, что это будет Лос-Анджелес. - person brain storm; 04.11.2017
comment
Список зон с одинаковым часовым поясом отсортирован по названию, поэтому первой в списке будет Америка/Бойсе. - person Aguid; 04.11.2017

TimeZone.getAvailableIDs() — это статический метод, который просто возвращает все известные идентификаторы для каждой зоны.

Вы можете использовать TimeZone.getAvailableIDs(int rawOffset), который возвращает идентификаторы для данного смещения в миллисекундах.

Для вашего примера дата/время

TimeZone tz = TimeZone.getTimeZone(zonedDateTime.getZone());
for (final String id : TimeZone.getAvailableIDs(tz.getRawOffset())) {
  System.out.println("id " + id);
}

дает:

id America/Boise
id America/Cambridge_Bay
id America/Chihuahua
id America/Creston
id America/Dawson_Creek
id America/Denver
id America/Edmonton
id America/Fort_Nelson
id America/Hermosillo
id America/Inuvik
id America/Mazatlan
id America/Ojinaga
id America/Phoenix
id America/Shiprock
id America/Yellowknife
id Canada/Mountain
id Etc/GMT+7
id MST
id MST7MDT
id Mexico/BajaSur
id Navajo
id PNT
id SystemV/MST7
id SystemV/MST7MDT
id US/Arizona
id US/Mountain
person greg-449    schedule 04.11.2017
comment
это неправильно, так как часовой пояс должен быть Los_Angeles. то есть PST, но то, что восстанавливается, является MST. Ввод, который передается, является PST - person brain storm; 04.11.2017
comment
Поскольку ваша дата имеет только смещение, Java не может узнать, используется ли переход на летнее время или нет, поэтому он просто указывает часовые пояса UTC-7 без перехода на летнее время. - person greg-449; 04.11.2017
comment
получение времени для Los_Angeles в Java будет учитывать летнее время и давать правильное время по запросу. Это одна из причин, по которой я хочу сохранить Los_Angeles, а не UTC-07:00. как бы мне теперь заняться конвертацией? - person brain storm; 04.11.2017