从Instant获取时间并保存在Cassandra中

时间:2018-12-20 05:44:41

标签: cassandra spring-data spring-data-cassandra

我在Cassandra表中有“ eventTime”字段,数据类型为“ time”。我试图节省当前的UTC时间,但不能。我在Java中将字段声明为-

private Long eventTime;

尝试了几种从即时获取时间的方法,但保存的数据不正确。

  
      
  1. Instant.now(clock).getLong(ChronoField.NANO_OF_SECOND)
  2.   

在Cassandra中保存了“ 00:00:00.093563694”

  
      
  1. LocalDateTime.ofInstant(Instant.now(clock),ZoneOffset.UTC).getHour()
  2.   

在Cassandra中保存了“ 00:00:00.000000001”

如果我直接在CQL中运行插入查询,其字符串值为'16:15:09.049909',那么它会起作用。

我应将数据类型更改为“文本”并将时间另存为String。

2 个答案:

答案 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);