Как объединить java.sql.Date и java.sql.Time в java.util.Date?

У меня есть два объекта: java.sql.Date и java.sql.Time,
Как лучше всего объединить их в единый java.util.Date?

В базе данных эти столбцы хранятся отдельно. Я получаю их по JDBC rs.getDate("Date") а также rs.getTime("Time");,

3 ответа

Решение

Вы можете создать два экземпляра календаря. В первом вы инициализируете дату, а во втором время. Вы можете извлечь значения времени из экземпляра "time" и установить для них "date".

  // Construct date and time objects
  Calendar dateCal = Calendar.getInstance();
  dateCal.setTime(date);
  Calendar timeCal = Calendar.getInstance();
  timeCal.setTime(time);

  // Extract the time of the "time" object to the "date"
  dateCal.set(Calendar.HOUR_OF_DAY, timeCal.get(Calendar.HOUR_OF_DAY));
  dateCal.set(Calendar.MINUTE, timeCal.get(Calendar.MINUTE));
  dateCal.set(Calendar.SECOND, timeCal.get(Calendar.SECOND));

  // Get the time value!
  date = dateCal.getTime();

Ответ istovatis является правильным, за исключением того, что не переносит миллисекунды. Я хотел бы внести современный ответ. java.sql.Date а также java.sql.Time давно устарели, и их замены, LocalDate а также LocalTime классы, сделать вашу задачу намного проще. Предполагая, что вы используете Java 8 или новее и JDBC 4.2 или новее, получите эти типы из набора результатов и объедините их:

    LocalDate date = rs.getObject("Date", LocalDate.class);
    LocalTime time = rs.getObject("Time", LocalTime.class);
    LocalDateTime dateTime = date.atTime(time);

Если у вас нет прямого доступа к вашему набору результатов SQL и получите java.sql.Date а также java.sql.Time из какого-то устаревшего API, который вы не можете изменить, я рекомендую вам преобразовать его в современные типы, а затем использовать тот же способ слияния:

    LocalDate date = sqlDate.toLocalDate();
    LocalTime time = sqlTime.toLocalTime();

    LocalDateTime dateTime = date.atTime(time);

Вы просили java.util.Date, Этот класс тоже давно устарел, поэтому лучше использовать LocalDateTime из приведенного выше кода (или, возможно, преобразовать в ZonedDateTime или же Instantв зависимости от того, для чего вы будете его использовать). Если вам нужно Date для некоторых других устаревших API, которые вы не можете изменить, выполните преобразование следующим образом:

    Instant inst = dateTime.atZone(ZoneId.systemDefault()).toInstant();
    java.util.Date utilDate = java.util.Date.from(inst);

Если ваш устаревший API требует Timestamp объект, это еще проще:

    Timestamp ts = Timestamp.valueOf(dateTime);

Ссылка: Oracle, учебник: Дата и время, объясняющие, как использовать java.time,

У обоих есть время и день, так что вы можете сделать что-то вроде:

Date d = new Date(2013, 11, 23);
Time t = new Time(23, 45, 45);
d.setMinutes(t.getMinutes());
d.setHours(t.getHours());
d.setSeconds(t.getSeconds());
Другие вопросы по тегам