Как объединить 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());