IBATIS TypeHandlerCallback getResult (получатель ResultGetter) для преобразования времени EST в время UTC - PullRequest
0 голосов
/ 03 декабря 2010

Спасибо за решение, но оно не работает для меня. Я имею дело со сценарием, в котором я устанавливаю дату (с информацией о времени и часовом поясе) в базе данных оракула. ​​Я использую Ibatis, чтобы извлечь эту дату и назначить ее объекту Java даты. Я реализовал свой TypeHandlerCallback следующим образом:

открытый класс DateTimezoneTypeHandler реализует TypeHandlerCallback {

public void setParameter (установщик ParameterSetter, параметр Object) выдает 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 (метка времени, календарь); }}

@ Переопределить публичный объект getResult (получатель ResultGetter) выдает SQLException {

Календарь календаря = Calendar.getInstance (TimeZone.getTimeZone ("UTC"));

return getter.getTimestamp (calendar);

}

@ Переопределить public Object valueOf (String s) {throw new UnsupportedOperationException ("DateTimezoneTypeHandler.valueOf () не поддерживается."); }}

Я сохранил свою дату в базе данных в часовом поясе EST, поэтому получатель имеет дату в часовом поясе EST. Теперь, когда дата считывается из базы данных, вызывается функция getResult, но дата EST не преобразуется в UTC / Часовой пояс GMT. Это конвертирование даты с часовым поясом EST в дату с часовым поясом моей локальной системы

** открытый объект getResult (получатель ResultGetter) выдает SQLException {

Календарь календаря = Calendar.getInstance (TimeZone.getTimeZone ("UTC"));

return getter.getTimestamp (calendar);

} **

Вот мое сопоставление sql:

Я не понимаю, в чем проблема с реализацией этого метода и почему не требуется его функциональность.

Пожалуйста, дайте мне знать, если у кого-нибудь есть какие-либо предложения / решения по этому вопросу. Я действительно ценю это.

Ответы [ 2 ]

0 голосов
/ 01 июля 2011

FWIW, наша компания перестала хранить даты и время в качестве часового пояса Oracle в базе данных. Слишком большая зависимость от внешней конфигурации. Вместо этого мы делаем следующее:

  1. Поскольку запрос currentTimeMillis возвращает абсолютный момент времени , мы создаем TypeHandler для класса Java Date, который сохраняет дату / время в столбце NUMBER в базе данных
  2. Поскольку чтение миллис-из-эпохи трудно для людей, мы добавляем 2 функции в базу данных для преобразования из / в миллис, чтобы администраторы могли по-прежнему писать запросы, если им нравится

Преимущество этого состоит в том, что вы обходите любую «умную» обработку времени чем-либо за пределами JVM. Это особенно удобно, когда люди вводят дату в стороннем браузере, передают ее в серверное приложение, а затем передают в базу данных.

В случае, если вы хотите сохранить Даты в базе данных (иногда вам приходится делать это), я лично могу порекомендовать Joda-Time для упрощения обработки дат, времени, григорианских календарей и тому подобного .

0 голосов
/ 03 декабря 2010

Проблема в том, что вы на самом деле не переводите время. Установка часового пояса не заставляет Calendar преобразовывать текущее значение в новый часовой пояс. Вот пример кода, который выполняет перевод часового пояса GMT-5 (он же 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));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...