java - 将日期作为 UTC 保存到数据库

标签 java date grails jodatime

用户在我的 Web 应用程序(Grails,如果这很重要)的页面上选择日期和时间。我知道用户的时区(他们在用户首选项中设置)。我现在想将该日期作为 UTC 保存到数据库中(如果重要的话,使用 Hibernate)。

所以,这是我的域类:

class Even {
    Date startTime
}

我有点想我想这样做:
def beforeInsert() {
    startTime = new DateTime(startTime, user.timeZone).withZone(TimeDateZone.UTC).toDate()
}

但是 toDate()最后只返回相同的 startTime我从它开始(因为我认为 Date 没有时区信息)。

那么,我如何获得 Date用户已提供(考虑到他们的时区)并将其作为 UTC 保存到数据库中?

我正在考虑做一些类似 new Date() - user.timeZone.rawOffset 的事情但是我必须处理夏令时,而且感觉很容易出错。

最佳答案

可能有更快的解决方案,但执行此操作的标准方法是使用自定义 Hibernate UserType .这是一个处理 Hibernate 3.x 部分的示例实现(接口(interface)在 4.x 中略有不同,但代码几乎相同)并将字符串 -> 日期和日期 -> 字符串的转换留给读者练习:

package my.package

import java.sql.PreparedStatement
import java.sql.ResultSet
import java.sql.SQLException
import java.sql.Types

import org.hibernate.usertype.UserType

class UtcDateUserType implements UserType {

    def nullSafeGet(ResultSet rs, String[] names, owner) throws SQLException {
        String value = rs.getString(names[0])
        if (value) {
            return utcStringToDate(value)
        }
    }

    void nullSafeSet(PreparedStatement st, value, int index) throws SQLException {
        if (value) {
            st.setString index, dateToUtcString(value)
        }
        else {
            st.setNull index, Types.VARCHAR
        }
    }

    protected Date utcStringToDate(String s) {
        // TODO
    }

    protected String dateToUtcString(Date d) {
        // TODO
    }

    def assemble(Serializable cached, owner) { cached.toString() }
    def deepCopy(value) { value.toString() }
    Serializable disassemble(value) { value.toString() }
    boolean equals(x, y) { x == y }
    int hashCode(x) { x.hashCode() }
    boolean isMutable() { false }
    def replace(original, target, owner) { original }
    Class<String> returnedClass() { String }
    int[] sqlTypes() { [Types.VARCHAR] as int[] }
}

mapping 的域类中注册它 block ,例如
import my.package.UtcDateUserType

....

static mapping = {
   startTime type: UtcDateUserType
}

这是描述in the docs here .

关于java - 将日期作为 UTC 保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26927167/

相关文章:

mysql - 转换后更新存储为 VARCHAR 的表中的 DATE

javascript - 从 Javascript 文件访问 Controller 值(映射)

java - 如何使用 URI 模板更改 Java 中 URL 中的路径参数

java - 为什么使用 Java SimpleDateFormat 会减少一个月?

date - 使用 Spark SQL 从 ISO 8601 解析日期时间

没有管理器的 Grails Spring Security Ldap

javascript - 在 Grails 中将模型传递到添加到 DOM 弹出窗口

Java 正则表达式澄清

java - SetUp,初始化Junit测试

java - 按通用属性的属性对对象进行排序