Преобразовать время UT C в местное время, используя местный год / месяц / день и указав часы / минуты JAVA - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь преобразовать 09:00 UT C в локальный эквивалент следующим образом:

    ZoneId localZoneId = ZoneId.of(TimeZone.getDefault().getID());
    DateTimeFormatter formatt = DateTimeFormatter.ofPattern("HH:mm").withZone(localZoneId);
    ZonedDateTime test = ZonedDateTime.of( 2020 , 4 , 25 , 9 , 0 , 0 , 0 , ZoneId.of("UTC"));
        String test2 = formatt.format(test);
        System.out.println(test);
        System.out.println(test2);

Вывод

2020-04-25T09:00Z[UTC]
02:00

Однако, вместо того, чтобы вручную вводить год, месяц и день, я хочу получить текущий год, месяц, день с локального компьютера, но по-прежнему сохранять часы / минуты в 09: 00. Эта часть кода должна работать следующим образом

    ZonedDateTime test = ZonedDateTime.of( currentYear, currentMonth , currentDay, 9 , 0 , 0 , 0 , ZoneId.of("UTC"));

Думал об этом, но похоже, что много кода:

        ZonedDateTime dateparse= ZonedDateTime.now();
        ZoneId localZoneId = ZoneId.of(TimeZone.getDefault().getID());
        DateTimeFormatter formatFullLocal = DateTimeFormatter.ofPattern("HH:mm").withZone(localZoneId);


        DateTimeFormatter year = DateTimeFormatter.ofPattern("yy");
        String localMachineYearString= year.format(dateparse);
        int localMachineYearInt = Integer.parseInt(localMachineYearString);


        DateTimeFormatter month= DateTimeFormatter.ofPattern("M");
        String localMachineMonthString= month.format(dateparse);
        int localMachineMonthInt= Integer.parseInt(localMachineMonthString);


        DateTimeFormatter day= DateTimeFormatter.ofPattern("dd");
        String localMachineDayString= day.format(dateparse);
        int localMachineDayInt= Integer.parseInt(localMachineDayString);


        ZonedDateTime test =ZonedDateTime
                .of(localMachineYearInt, localMachineMonthInt , localMachineDayInt , 9 , 0 , 0 , 0 , ZoneId.of("UTC"));

Спасибо!

1 Ответ

3 голосов
/ 26 апреля 2020

tl; dr

ZonedDateTime.now().with( LocalTime.of( 9 , 0 ) )

Объект LocalTime при передаче методу with действует как TemporalAdjuster, чтобы перейти к другому значению даты и времени. Это значение доставляется в новом sh новом объекте, а не изменяя оригинал, как неизменных объектов .

Строка кода выше неявно зависит от текущего часового пояса JVM по умолчанию. Лучше указать явно.

Подробности

Кстати, не смешивайте устаревшие классы даты и времени с java .time классами. Избегайте старых классов полностью. Так вот:

ZoneId localZoneId = ZoneId.of(TimeZone.getDefault().getID());

… должно быть:

ZoneId localZoneId = ZoneId.systemDefault() ;

Кроме того, «local» в java .time означает «не зонирован», или зона / смещение неизвестно или не указано. Так что имя вашей переменной localZoneId сбивает с толку. Должно быть что-то вроде этого:

ZoneId zoneId = ZoneId.systemDefault() ;

Вы сказали:

Я хочу получить текущий год, месяц, день с локальной машины

Для определения текущей даты требуется часовой пояс. В любой момент времени дата меняется по всему земному шару в зависимости от часового пояса.

ZoneId z = ZoneId.systemDefault() ;
LocalDate today = LocalDate.now( z ) ;

Вы сказали:

, но по-прежнему держите часы / минуты в 09: 00

A ZonedDateTime представляет дату и время дня в контексте часового пояса. Вы можете указать каждую из этих трех частей в заводском методе ZonedDateTime.of.

LocalTime lt = LocalTime.of( 9 , 0 ) ;
ZonedDateTime zdt = ZonedDateTime.of( today , lt , z ) ;
...