我在Cassandra表中有“ eventTime”字段,数据类型为“ time”。我试图节省当前的UTC时间,但不能。我在Java中将字段声明为-
private Long eventTime;
尝试了几种从即时获取时间的方法,但保存的数据不正确。
- Instant.now(clock).getLong(ChronoField.NANO_OF_SECOND)
在Cassandra中保存了“ 00:00:00.093563694”
- LocalDateTime.ofInstant(Instant.now(clock),ZoneOffset.UTC).getHour()
在Cassandra中保存了“ 00:00:00.000000001”
如果我直接在CQL中运行插入查询,其字符串值为'16:15:09.049909',那么它会起作用。
我应将数据类型更改为“文本”并将时间另存为String。
答案 0 :(得分:0)
您想将当前时间保存到Cassandra?
LocalTime localTime = LocalTime.now();
您正在代码中以ChronoField.NANO_OF_SECOND
或.getHour()
的形式提取上面的一些信息。只需完全使用当地时间即可。
答案 1 :(得分:0)
如果您按照文档https://docs.datastax.com/en/developer/java-driver/3.6/manual/custom_codecs/extras/#jdk-8
中所述使用Java驱动程序中的可选编解码器,则可以将Instant
映射到Cassandra的timestamp
中。
添加到以下pom.xml:
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-extras</artifactId>
<version>3.6.0</version>
</dependency>
并在创建Cluster
对象时注册编解码器:
import com.datastax.driver.extras.codecs.jdk8.InstantCodec;
import java.time.Instant;
...
cluster.getConfiguration().getCodecRegistry()
.register(InstantCodec.instance);