Кассандра Java дата выпуска - PullRequest
0 голосов
/ 15 января 2020

У меня есть дата в виде строки, и теперь я хочу сохранить ту же дату и время в столбце метки времени в Cassandra db. В запросе cql sh отметка времени показывается отличной от фактической. Я анализирую его с помощью простого средства форматирования даты SimpleDateFormat ("E MMM dd HH: mm: ss yyyy") и сохраняю.

ex: строковая дата: ср. 15 января 14:29:00 2020, в дБ: 2020 -01-16 05: 50: 40.000000 + 0000

Также иногда я получаю эту ошибку: DateOverFlowWarning: Некоторые метки времени больше, чем Python datetime. Отметки времени отображаются в миллисекундах с начала эпохи.

1 Ответ

1 голос
/ 16 января 2020

Предостережение: я не использую Кассандру. Но, возможно, это поможет.

Типы данных

Как вы, кажется, поняли, не храните значения даты и времени в виде текста, если ваша база данных поддерживает соответствующий тип данных даты и времени.

Текстовые форматы

И, к вашему сведению, ваш формат для представления значения времени и даты ужасен. При сериализации значений времени и даты в виде текста используйте стандартные форматы ISO 8601 .

Момент в зависимости от даты-времени-дня

Другая проблема: вы пытаясь отследить моменты с использованием типа timestamp в Cassandra , но сохраненные вами строки, такие как Wed Jan 15 14:29:00 2020, не являются моментом. Без контекста часового пояса или смещения от UT C мы не можем знать, является ли это время почти 14:30 в 14:30 в Токио, Япония, или в 14:30 в Толедо, Огайо, США, два очень разных моменты с интервалом в несколько часов.

Если вы знаете предполагаемый часовой пояс для этой даты и времени суток, примените ZoneId, чтобы получить ZonedDateTime. Я предполагаю, что UT C (смещение нуля часов-минут-секунд) было предназначено.

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;

См. Этот код, запущенный на IdeOne.com .

База данных

Если у вас есть драйвер для Cassandra, который поддерживает JDB C 4.2 и более поздние версии, вы сможете отправить этот java .time объект напрямую.

myPreparedStatement.setObject( … , odt ) ;

Если нет, вы можете получить счет в миллисекундах с начала отсчета эпохи первого момента 1970 года по Гринвичу C.

long milliseconds = odt.toInstant().toEpochMilli() ;

миллисекунд: 1579098540000

Идя в другом направлении.

Instant instant = Instant.ofEpochMilli( milliseconds ) ;

получая эту ошибку: DateOverFlowWarning: Некоторые метки времени больше, чем Python datetime может представлять

Я могу только угадай. Где-то в вашем наборе инструментов есть библиотека Python. Я полагаю, что библиотека ограничена использованием 32-разрядного целого числа. Но вам нужно 64-разрядное целое число для представления количества миллисекунд с 1970-01-01T00: 00Z для значения Cassandra timestamp.


Table of date-time types in Java (both legacy and modern) and in standard SQL


О java .time

java .time фреймворк встроен в Java 8 и позже. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, см. Учебник Oracle . И поиск переполнения стека для многих примеров и объяснений. Спецификация: JSR 310 .

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java .time классов.

Вы можете обмениваться java .time объектами напрямую с вашей базой данных. Используйте драйвер JDB C , совместимый с JDB C 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java .time?

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 и более поздних версий - часть стандартного API Java со связанной реализацией.
    • 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… .
...