Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将日期另存为UTC_Java_Date_Grails_Jodatime - Fatal编程技术网

Java 将日期另存为UTC

Java 将日期另存为UTC,java,date,grails,jodatime,Java,Date,Grails,Jodatime,用户在我的web应用程序(Grails,如果有必要的话)的页面上选择日期和时间。我知道用户的时区(他们在用户首选项中设置)。现在我想将该日期保存为UTC(如果有必要,使用Hibernate) 下面是我的域类: class Even { Date startTime } 我有点想我想这样做: def beforeInsert() { startTime = new DateTime(startTime, user.timeZone).withZone(TimeDateZone.U

用户在我的web应用程序(Grails,如果有必要的话)的页面上选择日期和时间。我知道用户的时区(他们在用户首选项中设置)。现在我想将该日期保存为UTC(如果有必要,使用Hibernate)

下面是我的域类:

class Even {
    Date startTime
}
我有点想我想这样做:

def beforeInsert() {
    startTime = new DateTime(startTime, user.timeZone).withZone(TimeDateZone.UTC).toDate()
}
但是最后的
toDate()
只返回与我开始时相同的
startTime
(因为我认为日期没有时区信息)

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


我在考虑做一些类似于
new Date()-user.timeZone.rawOffset
的事情,但是我必须处理夏时制,这感觉非常容易出错。

可能有一个更快的解决方案,但标准的方法是使用自定义的Hibernate
用户类型。下面是一个示例实现,它处理Hibernate 3.x部分(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[] }
}
已对此进行了说明。

请查看以下内容:
import my.package.UtcDateUserType

....

static mapping = {
   startTime type: UtcDateUserType
}