tl; dr
Используйте тип Cassandra duration
вместо time
.
Передача или анализ стандартных строк ISO 8601 с использованием класса java.time.Duration
.
Duration.parse( "PT1H30M" ) // Parse ISO 8601 string into a `Duration` object.
.toString() // Generate a ISO 8601 string from the `Duration` object.
Duration
не время
Класс java.time.Duration
представляет промежуток времени, не привязанный к временной шкале. не представляет время суток.
Тип Cassandra time
определяется как:
Значение кодируется как 64-разрядное целое число со знаком, представляющее количество наносекунд с полуночи.Значения могут быть представлены в виде строк, например 13: 30: 54.234.
Поэтому вам не следует хранить значение Duration
с использованием типа Cassandra time
.
Youесть другие варианты.
Один из вариантов - хранить стандартное ISO 8601 текстовое представление длительности : PnYnMnDTnHnMnS
.Пример: полтора часа - PT1H30M
.Эта опция более правдива, но значения нельзя сравнивать или сортировать в Кассандре, поскольку они будут просто текстом без алфавитного порядка в хронологическом порядке.Также см. Раздел «Продолжительность Кассандры» ниже в этом ответе.
Другой вариант заключается в извлечении двух чисел, используемых внутри, в Duration
:
- 64-разрядное целое число, подсчет целых секунд.
- A32-разрядное целое число, число наносекунд в доли секунды.
Если вы настаиваете, вы можете использовать эти числа, чтобы сгенерировать значение для хранения в качестве Cassandra time
, но вы бынарушая семантику.
long fakeNanosSinceMidnight = TimeUnit.SECONDS.toNanos( duration.getSeconds ) + duration.getNano() ; // NOT recommended, but if you insist on abusing Cassandra semantics, here you go.
Cassandra Duration
Cassandra В документации сказано, что a duration
тип встроен.Я не пользователь Кассандры, поэтому я не могу ручаться за это.
В документе указано, что он принимает стандартную строку продолжительности ISO 8601 в качестве входных данных.Метод Duration::toString
в Java генерирует такие строки, в то время как Duration::parse
анализирует то же самое.
String inputDurationForCassandra = duration.toString() ;
И разбор.
Duration duration = Duration.parse( myCassandraDurationString ) ;
Имейте в виду, что Java использует класс Duration
для дней (общие 24-часовые чанки, а не календарные дни), часов, минут и секунд.Класс Period
представляет годы, месяцы, дни.Обычно нет смысла соединять эти два понятия.Но если вы настаиваете, вы можете использовать класс PeriodDuration
, найденный в библиотеке проекта ThreeTen-Extra .