我正在使用幻像1.29.4和scala 2.11.8,试图用scala对cassandra进行操作。我有我的数据模型如下...
case class User(id: Long, name: String, createdDate: Timestamp, ...)
class UserTableMapping extends CassandraTable[UserTableDao, User] {
...
object createdDate extends DateTimeColumn(this)
...
}
abstract class UserTableDao extends UserTableMapping with RootConnector {
def createUser(user: User) = insert.value...(_.createdDate, user.createdDate)
...
}
现在,我收到类型不匹配错误("期望com.websudos.phantom.dsl.DateTime实际java.sql.Timestamp"这是显而易见的)...现在我的问题是我怎么做将Timestamp转换为DateTime(因为,我在不同的子项目中有我的服务层,我不想在那里添加所有幻影dsl jar)或者提供当前时间到Datetime?
我也试过提供如下隐式转换......
implicit def sqlTimestampToPhantomDateTime(dt: Timestamp): DateTime = new DateTime(dt)
但仍然没有运气......
请帮助我们,因为我是cassandra的新手...谢谢...
答案 0 :(得分:4)
另一个答案是正确的,说幻像只是默认使用Joda Time,但它引入了一个相当危险的建议,即使用new DateTime()
空param构造函数,它将使用机器的本地时区&# 39;正在执行。
默认情况下,幻像在从Cassandra解析时会强制执行DateTimeZone.UTC
,因为Cassandra只处理timestamp
类型的UTC时间。
所以你必须使用new Datetime(time, DateTimeZone.UTC)
来确保你从Cassandra那里得到的东西和你输入的东西一样。
答案 1 :(得分:1)
这只是一个joda DateTime:
type DateTime = org.joda.time.DateTime
joda DateTime有一个millisecond constructor,所以你几乎就在那里。您需要做的就是从Timestamp
实例获取毫秒的时间戳,并使用它来构建DateTime
实例:
new DateTime(timestampInstance.getTime, DateTimeZone.UTC)
但是,您也可以创建一个具有当前时间的新DateTime实例:
new DateTime(DateTimeZone.UTC)
编辑:对于将来阅读此内容的人来说,@ flavian对幻像处理时区的方式提出了一个有效的观点,我编辑了这一点来反映它。