У Java есть наивная временная метка? - PullRequest
0 голосов
/ 29 мая 2018

Как мы выяснили в предыдущий вопрос длинная временная метка в java подразумевает временную метку Unix:

long ts = 1362156863140L

Но есть ли наивная временная метка в Java?Или класс, который считает, что метка времени в конструкторе не знает о часовом поясе?

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Используемая вами терминология интересна.«Временная метка» в большинстве определений является уникальным моментом времени и, следовательно, должна быть связана с UTC - либо точно на основе UTC, либо с фиксированным смещением от UTC.Таким образом, «наивная временная метка» является чем-то вроде противоречия.

Однако действительно существует класс , который представляет дату и время без часового пояса, что составляет * 1006.*.Он является частью java.time API, представленного как JSR-310 с Java 8.

Вы можете использовать LocalDateTime.ofEpochSecond, чтобы создать его из числовой метки времени.Если ваша временная метка основана на миллисекундах, то вы можете сделать некоторое деление и по модулю, чтобы разделить ее на отдельные параметры секунд и наносекунд.Вам также нужно будет передать ему смещение UTC, чтобы он знал, как вы хотите интерпретировать входящее значение.

0 голосов
/ 29 мая 2018

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?

  • Java SE 8 , Java SE 9 , Java SE 10, а позже
    • Встроенный.
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации комплекта Android классов java.time.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 29 мая 2018

Начиная с версии 1.8, Java имеет API Date / Time со всеми встроенными функциями даты и времени, которые вам могут понадобиться.

Пожалуйста, проверьте URL ниже для ознакомления и много примеров: http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html

...