【发布时间】:2021-10-20 15:09:06
【问题描述】:
我有一个java.sql.Date 对象,想将其转换为java.time.LocalDateTime 对象。
为了比较,我可以使用 java.util.Date 进行类似的转换:
java.util.Date utilDate = new java.util.Date(sqlDate.getTime());
System.out.println("date with time: " + utilDate);
This answer 对我不起作用,因为我的java.sql.Date 没有 getTimestamp 方法。
作为参考,this question 解决了相反的转换。
【问题讨论】:
-
你不能。根据定义,您只有一个日期,没有时间部分。您可以调用toLocalDate(),然后调用LocalDate 的atTime 方法来获取LocalDateTime,但您必须自己决定要应用到日期的时间。
-
U 可以转换成 java.sql.Timestamp(long/Instant time) 然后 localDateTime
-
编译器允许你这样做并不意味着它是安全或可靠的。让 java.sql.Date 和 java.sql.Time 扩展 java.util.Date 的决定是 Java SE 中一个不幸的设计错误。尽管它们继承了 getTime 方法,但该方法在子类中不可靠,不应调用。事实上,java.sql.Date 根本不应该使用;上级替换是
resultSet.getObject(1, LocalDate.class)。 -
那是因为 SQL DATE 没有时间,只有日期。
-
@JWoodchuck
java.sql.Date扩展java.util.Date试图假装是没有时间和区域/偏移量的日期是徒劳的。然而它确实有一个时间和一个区域/偏移量。这是一个很好的例子,说明如何不 来设计你的类。这些遗留的日期时间类是由不了解如何处理日期时间的人设计的。我敦促您尽快忘记这些遗留类。专注于仅使用 java.time 类。 JSR 310 被一致采用是有充分理由的。