Java: ZonedDateTime - получить смещение эталонной отметки времени - PullRequest
0 голосов
/ 30 октября 2018

У меня есть метка времени в UTC. Я конвертирую это в местное время. Мой часовой пояс CET / CEST.

2018-10-03 12:00 UTC => 14:00 CEST
2018-10-30 12:00 UTC => 13:00 CET

Из-за моего часового пояса система автоматически применяет правильное смещение: если я конвертирую метку времени летом, она автоматически добавляет 2 часа (независимо от того, который час, когда я конвертирую), если зимой, она добавляет 1 час.

Пока - так хорошо.

Теперь я хотел бы преобразовать временную метку UTC на основе другой временной метки. Если ссылка указана летом, она всегда должна добавлять 2 часа - независимо от того, является ли метка времени для преобразования летним или зимним - и если ссылка - зимой, она всегда должна добавлять 1 час.

Ref = 01.01.2018 = CET
2018-10-03 12:00 UTC => 13:00 CET
2018-10-30 12:00 UTC => 13:00 CET

Ref = 01.10.2018 = CEST
2018-10-03 12:00 UTC => 14:00 CEST
2018-10-30 12:00 UTC => 14:00 CEST

Так, как я могу узнать, какой часовой пояс (или какое смещение к UTC) имеет эталонная временная метка (в UTC), если мои системы работают нормально CEST / CET ??

Я обычно использую ZonedDateTime.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Вы можете получить ZoneId из имеющегося у вас эталона ZonedDateTime и использовать его для настройки временной отметки, имеющейся в UTC, на эту зону:

Настройка

    ZoneId cet = ZoneId.of("CET");

    // The reference timestamps, these could be any ZonedDateTime
    // but I specifically make one for winter and one for summer
    ZonedDateTime refWinter = ZonedDateTime.of(LocalDateTime.parse("2018-01-01T12:00"), cet);
    ZonedDateTime refSummer = ZonedDateTime.of(LocalDateTime.parse("2018-10-01T12:00"), cet);

    // The UTC timestamp that you want to convert to the reference zone
    ZonedDateTime utc = ZonedDateTime.of(LocalDateTime.parse("2018-10-03T12:00"), ZoneOffset.UTC);

Conversion

    // The converted timestamps
    ZonedDateTime convertedWinter = utc.withZoneSameInstant(refWinter.getOffset());
    ZonedDateTime convertedSummer = utc.withZoneSameInstant(refSummer.getOffset());

    System.out.println(convertedWinter); // 2018-01-03T13:00+01:00
    System.out.println(convertedSummer); // 2018-10-03T14:00+02:00
0 голосов
/ 30 октября 2018

Вы можете проанализировать вашу дату из строки в объект Date, если они находятся в UTC, а затем вы можете преобразовать их обратно в строку в вашем местном часовом поясе. Пожалуйста, проверьте ниже пример кода:

        SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        Date date = isoFormat.parse("2018-10-03 12:00");

        isoFormat.setTimeZone(TimeZone.getDefault());
        System.out.println("Date in my local timezone is "+isoFormat.format(date));
...