diff --git a/jOOQ/src/main/java/org/jooq/impl/Convert.java b/jOOQ/src/main/java/org/jooq/impl/Convert.java index 7fcdc632e9..db44ccaff2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Convert.java +++ b/jOOQ/src/main/java/org/jooq/impl/Convert.java @@ -891,10 +891,28 @@ final class Convert { // Date types can be converted among each other else if (java.util.Date.class.isAssignableFrom(fromClass)) { - return toDate(((java.util.Date) from).getTime(), toClass); + + // [#12225] Avoid losing precision if possible + if (Timestamp.class == fromClass && LocalDateTime.class == toClass) + return (U) ((Timestamp) from).toLocalDateTime(); + else if (Date.class == fromClass && LocalDate.class == toClass) + return (U) ((Date) from).toLocalDate(); + else if (Time.class == fromClass && LocalTime.class == toClass) + return (U) ((Time) from).toLocalTime(); + else + return toDate(((java.util.Date) from).getTime(), toClass); } else if (Temporal.class.isAssignableFrom(fromClass)) { - return toDate(convert(from, Long.class), toClass); + + // [#12225] Avoid losing precision if possible + if (LocalDateTime.class == fromClass && Timestamp.class == toClass) + return (U) Timestamp.valueOf((LocalDateTime) from); + else if (LocalDate.class == fromClass && Date.class == toClass) + return (U) Date.valueOf((LocalDate) from); + else if (LocalTime.class == fromClass && Time.class == toClass) + return (U) Time.valueOf((LocalTime) from); + else + return toDate(convert(from, Long.class), toClass); } // Long may also be converted into a date type diff --git a/jOOQ/src/main/java/org/jooq/tools/Convert.java b/jOOQ/src/main/java/org/jooq/tools/Convert.java index db87dbce03..b406ca82d3 100644 --- a/jOOQ/src/main/java/org/jooq/tools/Convert.java +++ b/jOOQ/src/main/java/org/jooq/tools/Convert.java @@ -883,7 +883,28 @@ public final class Convert { // Date types can be converted among each other else if (java.util.Date.class.isAssignableFrom(fromClass)) { - return toDate(((java.util.Date) from).getTime(), toClass); + + // [#12225] Avoid losing precision if possible + if (Timestamp.class == fromClass && LocalDateTime.class == toClass) + return (U) ((Timestamp) from).toLocalDateTime(); + else if (Date.class == fromClass && LocalDate.class == toClass) + return (U) ((Date) from).toLocalDate(); + else if (Time.class == fromClass && LocalTime.class == toClass) + return (U) ((Time) from).toLocalTime(); + else + return toDate(((java.util.Date) from).getTime(), toClass); + } + else if (Temporal.class.isAssignableFrom(fromClass)) { + + // [#12225] Avoid losing precision if possible + if (LocalDateTime.class == fromClass && Timestamp.class == toClass) + return (U) Timestamp.valueOf((LocalDateTime) from); + else if (LocalDate.class == fromClass && Date.class == toClass) + return (U) Date.valueOf((LocalDate) from); + else if (LocalTime.class == fromClass && Time.class == toClass) + return (U) Time.valueOf((LocalTime) from); + else + return toDate(convert(from, Long.class), toClass); } else if (Temporal.class.isAssignableFrom(fromClass)) { return toDate(convert(from, Long.class), toClass);