tl; dr
Вы используете противоречивые термины. Для отметки времени требуется часовой пояс или смещение от UTC по определению.
Изучите разницу между:
- Точкой на временной шкале (со ссылкой на времязона или смещение от UTC)
- Дата / время не привязано к временной шкале (отсутствует понятие зоны / смещения)
У каждого есть цель, но только первый представляет определенный момент.Слово « отметка времени » означает первое, а не второе.
Instant
есть ли ... отметка времени в Java?
Да, Instant
- это отметка времени.Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Если у вас есть счет в миллисекундах с даты отсчета эпохи 1970-01-01T00: 00: 00Z, проанализируйте как Instant
.Z
в конце означает UTC и произносится как «зулу».
long millisSinceEpoch = 1_362_156_863_140L ;
Instant instant = Instant.ofEpochMilli( millisSinceEpoch );
2013-03-01T16: 54: 23.140Z
Необходим часовой пояс
класс, который учитывает длинную метку времени в конструкторекак не осведомленный о часовом поясе
Вы используете противоречие в терминах.Отметка времени, если вы имеете в виду точку на временной шкале, определенный момент в истории, обязательно включает в себя часовой пояс или смещение от UTC. Временная метка по определению не может не знать о часовом поясе.
Обычно при обработке даты и времени мы используем UTC в качестве базовой линии для отслеживания времени.Эта линия в Гринвиче в Королевской обсерватории сквозь причуды истории обычно используется в качестве произвольного выбора, когда мы определяем новый день.
Что касается справочной даты эпохи 1970-01-01T00: 00: 00Z, то есть, но одной из пары дюжин или более справочников эпох, использованных виндустрия информационных технологий.
Без часового пояса или смещения от UTC у нас нет контекста, в котором мы могли бы придать значение дате и времени.Например, «следующая пятница в полдень» может означать 12 часов вечера в Индии или 12 часов дня во Франции, причем каждый из них будет с интервалом в несколько часов.Другой пример: через несколько минут после полуночи в Тунисе наступил новый день, а в Квебеке это все еще «вчера».
Если мы укажем часовой пояс, такой как «следующая пятница в полдень в Тихом океане / Окленде», то у нас есть конкретный момент, точка на временной шкале.
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
LocalDate todayAuckland = LocalDate.now( z ) ; // Need time zone to determine today’s date.
LocalDate sameOrNextFriday = todayAuckland.with( TemporalAdjusters.next( DayOfWeek.FRIDAY ) ;
LocalTime timeOfDay = LocalTime.of( 12 , 0 ) ;
ZonedDateTime noonNextFridayAuckland = ZonedDateTime.of( sameOrNextFriday , timeOfDay , z ) ; // Determines a specific moment on the timeline.
Instant noonNextFridayAucklandViewedAsUtc = noonNextFridayAuckland.toInstant() ; // Same moment, same point on the timeline, but viewed with wall-clock time of UTC.
Unzoned
есть ли наивная временная метка в Java?
Если под «наивным» вы подразумеваете дату-время, намеренно лишенное какой-либо концепции часового пояса или смещение от UTC , да: LocalDateTime
.Но не называйте такое значение «отметкой времени».
Всем трем Local…
классам в Java специально не хватает зоны / смещения.
Мне кажется, что ты чувствуешь, что можешь облегчить жизнь программированию, игнорируя проблемы часового пояса и смещения-из-UTC.Ты не можешь.Вы будете играть в рискованную игру «Плати сейчас или плати позже».
Несмотря на то, что вы действительно можете использовать типы Local…
для приложения, в котором только пользователи находятся в вашем родном городе, если ваше программное обеспечение должно справиться с любой ситуацией за пределами этой ограниченной области, у вас случится катастрофа.Если вам нужно общаться с кем-то в другом городе, сравнивать записи в журнале с удаленным сервером или общаться с другими программными системами, у вас будет неприятный беспорядок.
Почему тогда java.time включает LocalDateTime
или LocalDate
или LocalTime
?Когда вы должны использовать эти классы?Три ситуации:
- Зона или смещение неизвестно .Это плохо.Это неверные данные.Аналогично наличию цены / стоимости без знания валюты.
- Намерение - «каждыйздесь », как в каждом часовом поясе.Например, корпоративная политика, которая гласит: «Все наши фабрики будут работать на обед в 12:30» означает, что фабрика в Дели сломается за несколько часов до фабрики в Дюссельдорфе, которая ломается за несколько часов до фабрики в Детройте.Момент в будущем намечается, но мы боимся политиков переопределить часовой пояс .Правительства меняют правила своих часовых поясов с удивительной частотой и с удивительно небольшим предупреждением (даже вообще без предупреждения ).Поэтому, если вы хотите записаться на прием в 3 часа дня на определенную дату, и вы действительно имеете в виду 3 часа дня, независимо от какого-либо сумасшедшего решения, которое правительство может принять за это время, сохраните
LocalDateTime
.Чтобы распечатать отчет или отобразить календарь, динамически примените часовой пояс (ZoneId
), чтобы сгенерировать определенный момент (ZonedDateTime
или Instant
).Это нужно делать на лету, а не сохранять значение.
О java.time
фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы вытесняют старые классные устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .