【问题标题】:How to merge java.sql.Date and java.sql.Time to java.util.Date?如何将 java.sql.Date 和 java.sql.Time 合并到 java.util.Date?
【发布时间】:2013-10-15 14:05:26
【问题描述】:

我有两个对象:java.sql.Datejava.sql.Time
将它们合并为单个 java.util.Date 的最佳方法是什么?

在数据库中,这些列是单独存储的。我通过 JDBC rs.getDate("Date")rs.getTime("Time"); 获取它们。

【问题讨论】:

  • 为什么不使用 java.sql.Timestamp 一次性设置日期和时间?
  • 在数据库中这些列单独存储。我通过 JDBC rs.getDate("Date") 和 rs.getTime("Time"); 得到它们

标签: java datetime jdbc time date


【解决方案1】:

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

  // 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();

【讨论】:

【解决方案2】:

The answer by istovatis 是正确的,除了不超过毫秒。我想贡献现代答案。 java.sql.Datejava.sql.Time 现在早已过时,它们的替代品 LocalDateLocalTime 类让您的任务更加简单。假设您使用的是 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.Datejava.sql.Time,我建议您转换为现代类型,然后使用相同的方式合并:

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

    LocalDateTime dateTime = date.atTime(time);

您要求java.util.Date。该类也早已过时,因此最好使用上述代码中的LocalDateTime(或者转换为ZonedDateTimeInstant,具体取决于您将使用它的目的)。如果您确实需要 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

【讨论】:

    【解决方案3】:

    两者都有时间和日期,因此您可以执行以下操作:

    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());
    

    【讨论】:

    • 请记住,这些方法已被弃用,因为日期和时间概念的实现非常差。
    • 是的,我知道,但如果他(她)想这样做,我猜他(她)已经知道了。
    • 使用已弃用的方法并不是最好的方法。
    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多