Как получить часовой пояс по смещению utc? - PullRequest
0 голосов
/ 26 июня 2018

У меня смещение UTC -05: 00, я хочу получить имена часовых поясов по смещению.

ZoneOffset offset = ZoneOffset.of("-05:00");
System.out.println(offset.getId()); //prints -05:00

Я хочу получить такой результат:

America/Chicago
America/Eirunepe
Etc/GMT+5
Mexico/General 
...

Я хочу, чтобы часовые пояса были смещены -05:00 прямо сейчас (а не те, которые могут быть в другое время года).

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Сначала определите, когда «прямо сейчас»: используйте Instant.now() (если вы хотите получить последовательный ответ, звоните Instant.now() только один раз).

Затем выполните итерации по всем доступным часовым поясам и включите в них те, которые сейчас имеют смещение -05: 00. Сначала получите доступные идентификаторы часовых поясов в виде строк от ZoneId.getAvailableZoneIds(). Для каждого получим соответствующий ZoneId объект из ZoneId.of(String). Есть разные способы получить смещение прямо сейчас. Один из них - yourZoneId.getRules().getOffset(rightNow) (где rightNow - ваш Instant). Это дает вам ZoneOffset объект, который вы можете сравнить с вашим offset из вопроса, используя .equals(Object).

Удачного кодирования.

0 голосов
/ 26 июня 2018

Да, вы можете сделать это, проверьте это.

final List<ZoneId> timeZoneByUtc = ZoneId.getAvailableZoneIds().stream().map(ZoneId::of)
        .filter(z -> z.getRules().getOffset(Instant.now()) == ZoneOffset.ofHours(-5))
        .collect(Collectors.toList());

Обновление Согласно приведенному ниже комментарию, использование оператора == НЕ подходит для сравнения объектов, следовательно, это может быть улучшено с помощью метода equals, как показано ниже.

final List<ZoneId> timeZoneByUtc = ZoneId.getAvailableZoneIds().stream().map(ZoneId::of)
        .filter(z -> z.getRules().getOffset(Instant.now()).equals(ZoneOffset.ofHours(-5)))
        .collect(Collectors.toList());
0 голосов
/ 26 июня 2018
public class Main {

    public static void main(String[] args) {

        TimeZone tz = TimeZone.getTimeZone("GMT-05:00");
        String a[] = TimeZone.getAvailableIDs(tz.getOffset(System.currentTimeMillis()));
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }
}

O / P

America / Atikokan Америка / Богота Америка / Канкун Америка / Cayman Америка / Coral_Harbour Америка / Detroit Америка / Eirunepe Америка / Fort_Wayne Америка / Grand_Turk Америка / Гуаякиль Америка / Гавана ...

...