7

I have two objects: a java.sql.Date and a java.sql.Time.
What is the best way to merge them into single java.util.Date?

In the database those columns are stored separately. I get them by JDBC rs.getDate("Date") and rs.getTime("Time");.

4

3 回答 3

5

您可以创建两个日历实例。在第一个中,您初始化日期,在后者中初始化时间。您可以从“时间”实例中提取时间值并将它们设置为“日期”。

  // 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();
于 2013-10-15T14:28:00.867 回答
3

istovatis 的答案是正确的,除了没有超过毫秒。我想贡献现代答案。java.sql.Date并且java.sql.Time现在已经过时了,它们的替代品 theLocalDateLocalTimeclasses 使您的任务变得更加简单。假设您使用的是 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上述代码中的 (或者转换为ZonedDateTimeor 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.

于 2018-05-25T10:10:51.737 回答
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());
于 2013-10-15T14:10:18.667 回答