如何将Timestamp转换为com.websudos.phantom.dsl.DateTime或设置当前时间

时间:2016-10-12 16:16:29

标签: scala cassandra datastax phantom-dsl

我正在使用幻像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的新手...谢谢...

2 个答案:

答案 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对幻像处理时区的方式提出了一个有效的观点,我编辑了这一点来反映它。