IBATIS TypeHandlerCallback getResult(ResultGetter getter)用于将EST时间转换为UTC时间

时间:2010-12-03 17:34:04

标签: java oracle date timezone ibatis

感谢您的解决方案,但它不适合我。我正在处理我在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映射:

我不明白这个方法实现的问题是什么,以及为什么它不是必需的功能。

如果有人对此问题有任何建议/解决方案,请与我们联系。我真的很感激。

2 个答案:

答案 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时区。外部配置过于依赖。相反,我们执行以下操作:

  1. 由于要求currentTimeMillis返回absolute point in time,我们为Java Date类创建一个TypeHandler,它将日期/时间存储在数据库的NUMBER列中
  2. 因为阅读millis-from-epoch对人类来说很难,我们在数据库中添加2个函数以从/转换为millis,这样管理员仍可以编写查询,如果他们愿意
  3. 这样做的好处是可以避免JVM之外的任何“智能”时间处理。当人们在外国浏览器中输入日期,将其传递到您的服务器应用程序,然后将其传递到数据库中时,这尤其方便。

    如果您确实希望在数据库中存储日期(有时您必须执行这些操作),我个人可以推荐Joda-Time以便更轻松地处理日期,时间,格里高利日历等。