我有两个对象:java.sql.Date
和java.sql.Time
将它们合并为单java.util.Date
的最佳方式是什么?
在数据库中,这些列是分开存储的。我通过JDBC rs.getDate("Date")
和rs.getTime("Time");
获得它们。
答案 0 :(得分:4)
您可以创建两个日历实例。在第一个中初始化日期,在后者中初始化时间。您可以从“时间”实例中提取时间值并将它们设置为“日期”。
// 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();
答案 1 :(得分:1)
两者都有时间和日期,所以你可以这样做:
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());
答案 2 :(得分:1)
The answer by 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结果集并从某些您无法更改的旧API获取java.sql.Date
和java.sql.Time
,我建议您转换为现代类型然后使用合并的方式相同:
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 tutorial: Date Time解释如何使用java.time
。