【发布时间】:2012-09-24 15:04:15
【问题描述】:
我正在使用 Web 服务,插入记录,返回 XMLGregorianCalendar 类型的时间戳值。我需要将其转换为 java.sql.Timestamp 值,所以我使用了这样的函数。
public static java.sql.Timestamp getSqlTimeStamp(XMLGregorianCalendar xgc) {
if (xgc == null) {
return null;
} else {
return new Timestamp(xgc.toGregorianCalendar().getTime().getTime());
}
}
Timestamp timestamp=getSqlTimeStamp(ExitInXMLGregor.getTimestamp());
我的问题是在服务器中,我插入记录时的时间戳值是这样的:2012-10-03T19:23:22.342+02:00
但是当我进行类型转换时,我得到的时间戳值是这样的:2012-10-03T17:23:22.342
服务器中的时间(webservice 所在的位置)比我的语言环境多 2 小时,并且由于某种原因,我在转换后获得了插入语言环境的时间。 问题是我确实需要获取服务器时间,因为在数据库中,时间戳值与服务器一匹配,并且由于时间戳值不同,我在更新操作时遇到了问题。
请,我将不胜感激任何形式的帮助。谢谢!
编辑: 我有点找到解决方案,但不完全是我需要的。当我将 java.sql.Timestamp 格式的时间戳转换为 XMLGregorian 时,我设置了服务器的时区 (setTimeZone(TimeZone.getTimeZone("GMT+02:00")))。这实际上可行,但与理想的解决方案相去甚远(时区甚至服务器可能会发生变化)在这一点上知道服务器的时区会很棒,但我不知道如何...... .
public static XMLGregorianCalendar getXMLGregorianCalendar(Timestamp timestamp)
throws BaseException {
try {
GregorianCalendar gc = new GregorianCalendar();
gc.setTimeZone(TimeZone.getTimeZone("GMT+02:00"));
gc.setTimeInMillis(timestamp.getTime());
return DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
} catch (DatatypeConfigurationException ex) {
throw new BaseException(ex);
}
}
【问题讨论】:
-
使用另一个 toGregorianCalendar 方法,您可以在其中指定时区、区域设置和其他 XMLGregorianCalendar 默认值。
-
问题是,我怎么知道服务器的时区和语言环境。如果服务器更改时区或位置怎么办?
-
您可以通过向服务器询问当前时间戳来确定服务器的时区。我的猜测是,根据您问题中的日期,服务器距您以西 2 个时区。我不知道这是否对您有帮助,但出于这个原因,服务器上的时间戳应始终使用格林威治标准时间 (GMT) 时区存储。
标签: java spring timestamp gregorian-calendar