[jOOQ/jOOQ#12225] DefaultConverterProvider truncates timestamps to

milliseconds precision when converting from Timestamp to LocalDateTime
This commit is contained in:
Lukas Eder 2021-07-20 11:16:18 +02:00
parent f79e59c230
commit 1f9b1f887b
2 changed files with 42 additions and 3 deletions

View File

@ -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

View File

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