как конвертировать дату в секунды в Java - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть столбец даты в postgres db, значение которого 2018-11-20 22:07:20.Тип данных timestamz.Я хочу получить указанное выше значение в коде Java и преобразовать его в секунды относительно текущего времени.Предположим, что текущая дата 2018-11-21 22:07:20, тогда окончательный ответ должен быть 86400 секунд.Кто-нибудь может мне помочь с этим?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

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?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздних версий - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 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 голосов
/ 20 ноября 2018

Разобрать в LocalDateTime, затем получить Duration между этим и текущим временем и преобразовать его в секунды .

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("your pattern");
LocalDateTime dateTime = LocalDateTime.parse("2018-11-20 22:07:20", formatter);
return Duration.between(dateTime, LocalDateTime.now()).getSeconds();

Вы можете самостоятельно разработать шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...