Дата LocalDateTime в datetime, используя jodatime, но как добавить часовой пояс
Мне все равно, MST это или MDT, но у меня есть объект LocalDateTime со временем (т. е. нет часового пояса). Я хочу добавить MST или MDT и создать объект DateTime таким образом, что я могу получить миллисекунды, так как эпоха для хранения и миллисекунды из эпохи находится в UTC, конечно, так же, как система.currentTimeMillis находится в UTC.
Так есть ли способ сказать, что Горное время не зависит от экономии или дневного времени, поскольку оно должно знать, что от даты оно имеет себя, правильно? Как это сделать это?
Спасибо,
Дин
2 ответов:
Локальное время - это просто набор чисел (день, месяц, год, час, минута)...) которые представляют собой гражданское (а не физическое) понятие. Вместо этого Дата-Время-это физическое понятие (момент времени), которое, кроме того, имеет часовой пояс, и, следовательно, оно может быть выражено в дне/месяце/году.
Чтобы преобразовать LocalDateTime в Datetime, необходимо указать часовой пояс. Однако это преобразование не совсем точно определено; потому что приDST переходах два разных времени могут соответствуют одному и тому же локальному времени.
Tl; dr
Instant.now() // Capture the current moment in UTC. .atZone( ZoneId.of( "America/Edmonton" ) ) // Adjust from UTC to the wall-clock time in use by the people of a particular region (a time zone).... или ...
[39]}Java.времяZonedDateTime.now( ZoneId.of( "America/Edmonton" ) )ПроектJoda-Time , теперь находящийся в режимеобслуживания , советует перейти на java .время занятий.
Использовать зоны реального времени
Не используйте
MSTилиMDTили другие подобные сокращения из 3-4 букв. Они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны(!).Укажите собственное имя часового пояса в формате
continent/region, напримерAmerica/Montreal,Africa/Casablanca, илиPacific/Auckland.Если вы имели в виду часовой пояс слева от центра Северной Америки, укажите значимый часовой пояс, такой как
America/Edmonton. Помните, что Аризона имеет другую зону, никогда не принимавшую бессмыслицу летнего времени; поэтому там используютAmerica/Phoenix.
Instantдля UTCЕсли вы хотите работать в UTC, что часто бывает разумно, используйте класс
Instant. Тот самыйInstantкласс представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) знаков десятичной дроби).Instant instant = Instant.now(); // Current moment in UTC.Чтобы сгенерировать строку в стандартном формате ISO 8601, вызовите
toString.String output = instant.toString();2016-12-06T22: 26: 32.773 Z
Если вам нужен отсчет целых секунд с момента начала эпохи
1970-01-01T00:00:00Z, звонитеgetSeconds.long secondsSinceEpoch = instant.getSeconds();В течение миллисекунд, начиная с той же эпохи, вызовите
toEpochMilli.long milliseconds = instant.toEpochMilli();Я настоятельно рекомендую не обрабатывать значения даты и времени как отсчет-от-числа эпохи. Они подвержены ошибкам, их трудно отладить, поскольку люди не могут распознать значение таких чисел. Вместо этого:
- используйте java.объекты времени в коде.
- используйте ISO 8601 форматированные строки при сериализации значений.
Чтобы увидеть тот же самый момент через призму часового пояса региона, ихнастенных часов , примените
ZonedDateTimeZoneId, чтобы получитьZonedDateTime.ZoneId z = ZoneId.of( "America/Edmonton" ; ZonedDateTime zdt = instance.atZone( z );Идя в другом направлении, вы можете извлеките
Instantдля значения UTC.Instant instant = zdt.toInstant();
LocalDateTimeВ вашем вопросе упоминалось наличие
LocalDateTime. КлассыLocal…намеренно не имеют информации о часовом поясе или смещении. Таким образом, они не представляют точку на временной шкале.LocalDateTime ldt = LocalDateTime.of( 2016 , 1 , 23 , 12 , 34 , 56 );Ldt.toString (): 2016-01-23T12: 34: 56
Примените часовой пояс для получения
ZonedDateTime, придавая значение реальному значению.ZonedDateTime zdt = ldt.atZone( ZoneId.of( "America/Montreal" ) );ЗДТ.toString(): 2016-01-23T12: 34: 56-05: 00 [Америка / Монреаль]
Переход на летнее и зимнее время
Так есть ли способ сказать, что Горное время не зависит от экономии или дневного времени, поскольку оно должно знать, что от даты оно имеет себя, правильно?Вам не нужно беспокоиться о ДСТ или других подобных аномалиях. Ява.классы времени справляются с этим автоматически. Но нужно ли читать класс doc , чтобы понять поведение во время DST cut-over (получение или теряя час или что-то в этом роде), а также Когда вы можете попросить время настенных часов, которого не существует (в течение этого времени часы "прыгают вперед").
О java.время
Ява.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойные старые унаследованные классы даты и времени, такие как
java.util.Date,Calendar, &SimpleDateFormat.Джода-Время project, теперь находящийся в режиме обслуживания , советует перейти на java .время занятий.
Чтобы узнать больше, см. учебник Oracle. И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310.
Используя драйвер JDBC, совместимый с JDBC 4.2 или более поздней версией, вы можете обменять java.time объекты непосредственно с вашей базой данных. Нет необходимости в строках или java.язык SQL.* занятия.
Где получить java.время занятий?
- Java SE 8, Java SE 9, а потом ...
- встроенный.
- часть стандартного Java API со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и еще Java SE 7
- большая часть java.функциональность time обратно портирована на Java 6 & 7 in ThreeTen-Backport.
- Android
- более поздние версии Android bundle реализаций java.время занятий.
- для более ранних Android, ThreeTenABP проект адаптирует ThreeTen-Backport (упомянутый выше). Видишь Как использовать ThreeTenABP....
В ThreeTen-Экстра проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к java.время. Вы можете найти здесь некоторые полезные классы, такие как
Interval,YearWeek,YearQuarter, и еще.
Comments