Как мне объединить объект java.util.Date с объектом java.sql.Time? - PullRequest
6 голосов
/ 05 декабря 2008

Я извлекаю дату и время из базы данных. Они хранятся в отдельных полях, но я хотел бы объединить их в объект java.util.Date, который соответствующим образом отражает дату / время.

Вот мой оригинальный подход, но он ошибочен. Я всегда получаю дату / время на 6 часов меньше, чем должно быть. Я думаю, это потому, что время имеет смещение часового пояса, а также дату, и мне действительно нужен только один из них, чтобы сместить часовой пояс.

Любые предложения о том, как сделать это, чтобы он дал мне правильную дату / время?

import java.sql.Time;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang.time.DateUtils;
    public static Date combineDateTime(Date date, Time time)
        {
            if (date == null)
                return null;
            Date newDate = DateUtils.truncate(date, Calendar.DATE);
            if (time != null)
            {
                Date t = new Date(time.getTime());
                newDate = new Date(newDate.getTime() + t.getTime());
            }
            return newDate;
        }

Ответы [ 4 ]

10 голосов
/ 05 декабря 2008

Я бы поместил и дату, и время в объекты календаря, а затем использовал бы различные методы календаря для извлечения значений времени из второго объекта и помещения их в первый.

  Calendar dCal = Calendar.getInstance();
  dCal.setTime(date);
  Calendar tCal = Calendar.getInstance();
  tCal.setTime(time);
  dCal.set(Calendar.HOUR_OF_DAY, tCal.get(Calendar.HOUR_OF_DAY));
  dCal.set(Calendar.MINUTE, tCal.get(Calendar.MINUTE));
  dCal.set(Calendar.SECOND, tCal.get(Calendar.SECOND));
  dCal.set(Calendar.MILLISECOND, tCal.get(Calendar.MILLISECOND));
  date = dCal.getTime();
5 голосов
/ 05 декабря 2008

Используйте Joda Time вместо собственных классов Date в Java при выполнении этих действий. Это намного превосходящий API даты / времени, который делает то, что вы пытаетесь сделать, чрезвычайно простым и надежным.

4 голосов
/ 05 декабря 2008

@ Пол Томблин - верный способ контролировать проблему TimeZone, и я знал, что кто-то собирается добавить в ход «Joda Time». Все остальные ответы хороши и надежнее следующего хака:

Если ваше приложение выполняется в том же TimeZone, что и по умолчанию в БД, вы можете избежать следующих действий:

Если вы пропустите этот шаг:

Date t = new Date(time.getTime());

и используйте значение java.sql.Time напрямую, например:

newDate = new Date(newDate.getTime() + time.getTime());

преобразование по умолчанию TimeZone не будет введено - java.sql.Time должно содержать значение как сохраненное.

YMMV, caveat emptor и т. Д. *

1 голос
/ 05 декабря 2008

Если вы знаете часовой пояс времени, считываемого из базы данных, вам необходимо использовать метод ResultSet.getTime(String, Calendar), предварительно установив часовой пояс на Calendar. Драйвер JDBC произведет необходимые корректировки времени.

Если весь код работает на стороне сервера, я настоятельно рекомендую все время стандартизировать общий часовой пояс (возможно, UTC) и при необходимости конвертировать при отображении рендеринга в графическом интерфейсе.

Я бы также использовал JodaTime (http://joda -time.sourceforge.net ), это избавит вас от головной боли в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...