tl; dr
Duration // Represent a span-of-time unattached to the timeline.
.between( // Calculate elapsed time between two moments.
OffsetDateTime.now( ZoneOffset.UTC ) , // Capture the current moment as seen in UTC.
myResultSet.getObject( … , OffsetDateTime.class ) // Retrieve the moment stored in your database as a `OffsetDateTime` object, *not* as a mere string.
) // Return a `Duration` object.
.toSeconds() // View that duration as a total number of whole seconds. Obviously, any fractional second is ignored.
Подробности
Ответ от Michael близок, но не совсем корректен.
- Не удается учесть аномалии в вашем местном часовом поясе, такие как Летнее время (DST) :
LocalDateTime
- это неправильный класс, так как он не может,определение, представляющее момент. - Также не решается большая проблема, связанная с тем, что немые строки используются для обмена значениями даты и времени с базой данных, а не с использованием смарт-объектов.
столбец даты в postgres db, значение которого равно 2018-11-20 22: 07: 20
Нет, это не значение столбца.Это текстовое представление значения.В чем различие?К сожалению, многие инструменты, используемые для доступа к вашим данным, позволяют изменять данные, получаемые путем настройки часового пояса.
Еще хуже, в вашем примере текста отсутствует индикатор часового пояса или смещения от UTC.Это противоречит вашему следующему утверждению.
Тип данных - timestamz.
Я думаю, что вы написали с ошибкой timestampz
(отсутствует p
).Тем не менее, это кажется неправильным, поскольку среди типов Postgres такого типа нет в списке.Некоторые системы используют это слово как сокращение, но я рекомендую всегда использовать более длинное имя стандарта SQL для ясности.
Вы, вероятно, имели в виду тип TIMESTAMP WITH TIME ZONE
, который Postgres, как и некоторые другие базы данных, хранит как значение в UTC.Любой индикатор часовой пояс или смещение от UTC , присутствующий во входящих данных, используется для настройки на UTC , затем индикатор сбрасывается.Поэтому значения, входящие и выходящие из столбца a TIMESTAMP WITH TIME ZONE
в Postgres, равны всегда в UTC .Остерегайтесь, как упомянуто выше, некоторые инструменты мешают извлечению данных, вводя корректировку часового пояса, благими намерениями, хотя и очень запутанная антифункция.
Смарт-объекты, а не немые строки
Начиная с JDBC 4.2 мы можем обмениваться java.time объектами с базой данных с помощью методов setObject
и getObject
.Используйте объект вместо простых строк для обмена значениями даты и времени.
OffsetDateTime
Получите ваше значение из столбца типа TIMESTAMP WITH TIME ZONE
как значение OffsetDateTime
со смещением, установленным в UTC.
OffsetDateTime odtThen = myResultSet.getObject( … , OffsetDateTime.class ) ;
Для сравненияполучить текущий момент в UTC .Укажите смещение с помощью константы ZoneOffset.UTC
.
OffsetDateTime odtNow = OffsetDateTime.now( ZoneOffset.UTC ) ;
Чтобы сгенерировать текст, представляющий эту длительность в стандартном формате ISO 8601 , позвоните OffsetDateTime::toString
.
Duration
Захват прошедшего времени в виде объекта Duration
.
Duration d = Duration.between( odtNow , odtThen ) ;
Создание текста, представляющего эту продолжительность в стандарте ISO8601 формат, звоните Duration::toString
.
String output = d.toString() ; // PnYnMnDTnHnMnS
Чтобы увидеть всю эту длительность как один большой отсчет целых секунд, позвоните по номеру Duration::toSeconds
.
long secondsElapsed = d.toSeconds() ;
ZonedDateTime
Кстати, если вы хотите просмотреть значение odtThen
или odtNow
через объектив времени настенных часов, используемого людьми определенного региона (часового пояса), примените ZoneId
кполучить ZonedDateTime
.
Указать правильное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = odtThen.atZoneSameInstant( z ) ;
О 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 .