Как показать разницу во времени после начала перехода на летнее время в Java? - PullRequest
0 голосов
/ 07 ноября 2018

Я хотел проверить разницу во времени до и после начала перехода на летнее время. Я использую JVM, где часовой пояс имеет некоторые проблемы с DST WRT бразильского времени. Я мог видеть выходные данные, где говорится, что 21 октября подпадает под летнее время, что неправильно, так как переход на летнее время начался 4 ноября. Я хотел бы видеть разницу во времени, которая составляет 1 час между 20 октября и 21 октября, которую я мог видеть в своем заявлении из-за проблемы с часовым поясом JRE. Есть ли способ, которым я могу достичь этого с помощью программы. Здесь ниже код, который я использовал, чтобы увидеть, находится ли дата под DST или нет.

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class Timezone
{
    public static void main(String[] args) throws ParseException {
        TimeZone TIMEZONE = TimeZone.getTimeZone("Brazil/East");

        System.out.println("timeZone : " + TIMEZONE);
        Calendar c = Calendar.getInstance(TIMEZONE);
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        dateFormat.setTimeZone(TIMEZONE);

        Date date = dateFormat.parse("2018-10-20T00:00:00");
        c.setTime(date);
        System.out.println("In dst " + c.getTimeZone().inDaylightTime(c.getTime()));

        date = dateFormat.parse("2018-10-21T00:00:00");
        c.setTime(date);

        System.out.println("In dst " + c.getTimeZone().inDaylightTime(c.getTime()));

        date = dateFormat.parse("2018-11-04T00:00:00");
        c.setTime(date);
        System.out.println("In dst " + c.getTimeZone().inDaylightTime(c.getTime()));

    }
}

В дополнение к моему вопросу я смог выяснить, что переход на летнее время применяется с помощью моей вышеупомянутой программы. Я хотел бы кое-что, где это должно показать мне: 20 октября время - 9:00, тогда как то же самое время из-за перехода на летнее время сдвинуто на 1 час, то есть, 10:00. Есть ли способ добиться этого?

Ожидаемый результат:

     timeZone : sun.util.calendar.ZoneInfo[id="Brazil/East"]

         Time is: 21-10-2018 07:52:16

Фактический выход неисправен JVM:

        timeZone : timeZone : sun.util.calendar.ZoneInfo[id="Brazil/East"]

       Time is: 21-10-2018 08:52:30

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Решение состоит в том, чтобы исправить JVM с ошибочными (устаревшими) данными часового пояса. Это довольно просто сделать с помощью инструмента обновления часовых поясов от Oracle. См. Ссылку внизу (для OpenJDK см. Следующую ссылку).

Если вы хотите знать, когда ваша JVM «думает», что началось летнее время, вы можете использовать следующий код:

    ZoneId zone = ZoneId.of("America/Sao_Paulo");
    ZoneRules rules = zone.getRules();
    ZoneOffsetTransition dstStarted = rules.previousTransition(Instant.now());
    System.out.println(dstStarted);

Очевидно, в моей Java 11 есть свежие данные о часовых поясах, где лето началось 4 ноября. Я получил такой вывод:

Переход [Разрыв в 2018-11-04T00: 00-03: 00 до -02: 00]

«Разрыв» означает, что часы были переведены вперед, как в летнее время. Переходы, когда часы повернуты назад, печатаются как «Перекрытие».

При желании вы также можете запросить ZoneOffsetTransition о локальной дате и времени до и после перехода, моменте перехода, смещении UTC, примененном до и после перехода, о длине перехода со знаком ( здесь 1 час) и другая информация.

Я рекомендую java.time, современный Java-интерфейс даты и времени. Используемые вами классы даты и времени - TimeZone, Calendar, DateFormat, SimpleDateFormat и Date - все они плохо спроектированы и давно устарели.

Ссылки

0 голосов
/ 07 ноября 2018

Я добавлю очень краткий ответ. Это показывает, что 1 день не равен 24 часам, то есть DST изменился. Я также перешел на Java 8, потому что я более знаком с ним.

ZoneId timezone = ZoneId.of("Brazil/East");

ZonedDateTime t = ZonedDateTime.of(2018, 10, 20, 7, 52, 16, 0, timezone);

System.out.println(t);
System.out.println(t.plus(1, ChronoUnit.DAYS));
System.out.println(t.plus(24, ChronoUnit.HOURS));

Выход:

2018-10-20T07: 52: 16-03: 00 [Бразилия / East]
2018-10-21T 07 : 52: 16-02: 00 [Бразилия / East]
2018-10-21T 08 : 52: 16-02: 00 [Бразилия / East]

...