От новичка до гуру: Курсы программирования на CyberDuff

Путаница в java.Clock, systemDefaultZone() возвращает время UTC

Я пытаюсь понять, почему следующий java.time.Clock возвращает время UTC вместо местного часового пояса (EST).

C:\Users\Felipe>scala
Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_65).
Type in expressions for evaluation. Or try :help.

scala> import java.time._
import java.time._

scala> ZoneId.systemDefault()
res0: java.time.ZoneId = America/New_York

scala> val clock = Clock.systemDefaultZone()
clock: java.time.Clock = SystemClock[America/New_York]

scala> clock.instant
res1: java.time.Instant = 2017-07-06T16:20:04.990Z

Текущее время, когда я запустил вышеуказанное, было 12:20pm (т.е. за 4 часа до показанного времени UTC)

06.07.2017

  • Что говорит javadoc Instant#toString()? 06.07.2017
  • @SotiriosDelimanolis Вы правы, для toString по умолчанию используется UTC. Спасибо за разъяснения. У меня сложилось впечатление, что Instant будет действовать аналогично LocalDateTime.toString(), который просто показывает местное время, а не UTC. 06.07.2017
  • См. здесь stackoverflow.com/questions/25229124/format-instant-to- строка 06.07.2017

Ответы:


1

Метод Instant.toString() использует DateTimeFormatter.ISO_INSTANT средство форматирования, которое, в свою очередь, анализирует и форматирует Instant в формате UTC.

Поскольку 2017-07-06T16:20:04.990Z совпадает с 2017-07-06T12:20:04.990 в Нью-Йорке, вы получаете правильные результаты.

Если вы хотите, чтобы Instant было преобразовано в ваш часовой пояс, вы можете сделать:

clock.instant().atZone(ZoneId.systemDefault())

Или вы можете быть более конкретным (поскольку часовой пояс системы по умолчанию может быть изменен даже во время выполнения):

clock.instant().atZone(ZoneId.of("America/New_York"))

Это приведет к ZonedDateTime:

2017-07-06T12:48:22.890-04:00[Америка/Нью-Йорк]


Вы также можете преобразовать это в LocalDateTime, если хотите:

clock.instant().atZone(ZoneId.of("America/New_York")).toLocalDateTime()

Результатом будет LocalDateTime:

2017-07-06T12:49:47.688


PS: как @Andreas напомнил мне в комментариях (и я забыл упомянуть), класс Instant представляет только момент времени (количество наносекунд с 1970-01-01T00:00Z) и не имеет информации о часовом поясе, поэтому любое его представление (включая метод toString()) будет в формате UTC. Чтобы получить местную дату или время, соответствующие Instant, необходимо указать часовой пояс, как показано выше.

06.07.2017
  • Дело не только в методе toString(), но и в том, что Instant не имеет часового пояса: Класс Instant предназначен только для представления момента времени и внутренне хранит значение в наносекундах из фиксированной эпохи 1970-01-01Z. Таким образом, Instant не может быть отформатирован как дата или время без предоставления какой-либо формы часового пояса. Следовательно, формат UTC по умолчанию. 06.07.2017
  • @Андреас Действительно! Я сосредоточил объяснение на toString() и забыл упомянуть самую важную часть. Я добавил эту информацию в ответ, большое спасибо! 06.07.2017

  • 2

    Instant не имеет информации о часовом поясе. Это просто количество секунд/наносекунд с начала эпохи. LocalDateTime представляет время в местном часовом поясе, которое можно получить из часов, используя:

    LocalDateTime.now(clock)
    

    Вы также можете преобразовать Instant в ZonedDateTime (что представляет время вместе с часовым поясом), используя:

    clock.instant().atZone(ZoneId.systemDefault())
    
    06.07.2017
  • Если вы хотите ZonedDateTime, вы также должны использовать ZonedDateTime.now(clock), а не clock.instant().atZone(...), поэтому часовой пояс ZonedDateTime правильно берется из Clock. 06.07.2017
  • Новые материалы

    Представляем Narwhal Technologies (Nrwl)
    6 декабря 2016 г. Маунтин-Вью, Калифорния С тех пор, как Виктор Савкин и я (Джефф Кросс) присоединились к команде Angular в Google на заре Angular 1, Angular продемонстрировал феноменальный..

    Путь AWS  — «Изучение машинного обучения — 10 начинающих ИИ и машинного обучения на AWS».
    Универсальный ресурсный центр для изучения искусственного интеллекта и машинного обучения. НОЛЬ или ГЕРОЙ, начните свое путешествие здесь. Получите решения и пройдите обучение у экспертов AWS...

    5 простых концепций Python, ставших сложными
    #заранее извините 1) Переменные x = 4 y = 5 Переменная в Python — это символическое представление объекта. После присвоения некоторого объекта переменной Python мы приобретаем..

    «Освоение вероятности: изучение совместной, предельной, условной вероятности и теоремы Байеса —…
    Виды вероятности: Совместная вероятность Предельная вероятность Условная вероятность Диаграмма Венна в вероятностях: В “Set Theory” мы создаем диаграмму Венна...

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..