感谢您的解决方案,但它不适合我。我正在处理我在oracle数据库中设置日期(带时间和时区信息)的场景。我使用Ibatis提取此日期并将其分配给java Date对象。我按如下方式实现了我的TypeHandlerCallback:
public class DateTimezoneTypeHandler实现TypeHandlerCallback {
public void setParameter(ParameterSetter setter,Object parameter) 抛出SQLException
{java.util.Date date =(java.util.Date)参数; if(date == null)setter.setNull(Types.TIMESTAMP); else {Timestamp timestamp = new Timestamp(date.getTime());日历日历= Calendar.getInstance(TimeZone.getTimeZone(“UTC”)); setter.setTimestamp(timestamp,calendar); }}
@Override public Object getResult(ResultGetter getter)抛出SQLException {
日历日历= Calendar.getInstance(TimeZone.getTimeZone(“UTC”));
return getter.getTimestamp(calendar);
}
@Override public Object valueOf(String s){throw new UnsupportedOperationException(“DateTimezoneTypeHandler.valueOf()不受支持。”); }}
我已将我的日期存储在EST时区的数据库中,因此getter在EST时区中有日期。现在从数据库中读取日期时,会调用getResult函数,但EST日期不会转换为UTC / GMT时区。它将具有EST时区的日期转换为具有本地系统时区的日期
** public Object getResult(ResultGetter getter)抛出SQLException {
日历日历= Calendar.getInstance(TimeZone.getTimeZone(“UTC”));
return getter.getTimestamp(calendar);
} **
以下是我的sql映射:
我不明白这个方法实现的问题是什么,以及为什么它不是必需的功能。
如果有人对此问题有任何建议/解决方案,请与我们联系。我真的很感激。
答案 0 :(得分:0)
问题似乎是你实际上没有翻译时间。设置时区不会导致Calendar
将当前值转换为新时区。以下是一些执行时区转换GMT-5(aka EST)到UTC的示例代码。请注意,我使用Calendar.add
而非Calendar.roll
。
public static void main(String[] args)
{
Calendar calendar = Calendar.getInstance();
Date date;
int rawOffset;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("M/d hh:mm;ss a");
TimeZone timeZone;
date = calendar.getTime();
System.out.println(simpleDateFormat.format(date));
timeZone = TimeZone.getTimeZone("GMT-5");
rawOffset = timeZone.getRawOffset();
System.out.println(rawOffset);
calendar.add(Calendar.MILLISECOND, rawOffset);
date = calendar.getTime();
System.out.println(simpleDateFormat.format(date));
}
答案 1 :(得分:0)
FWIW,我们公司已停止将Dates和Times存储为数据库中的Oracle时区。外部配置过于依赖。相反,我们执行以下操作:
这样做的好处是可以避免JVM之外的任何“智能”时间处理。当人们在外国浏览器中输入日期,将其传递到您的服务器应用程序,然后将其传递到数据库中时,这尤其方便。
如果您确实希望在数据库中存储日期(有时您必须执行这些操作),我个人可以推荐Joda-Time以便更轻松地处理日期,时间,格里高利日历等。