From c8fe6466692941615ea2f58f2d78c0c362138b0d Mon Sep 17 00:00:00 2001 From: John DeRegnaucourt Date: Sun, 28 Jan 2024 08:40:39 -0500 Subject: [PATCH] Updated all the LocalTime, LocalDate, LocalDateTime, ZonedDateTime to use the newer DateUtilities.parseDate(_ API that returns TemporalAccessor that is either a LocalDateTime (when no timezone name or offset is present) or a ZonedDateTime when timezone name or offset is present. --- .../cedarsoftware/util/convert/Converter.java | 72 ++------------ .../util/convert/StringConversions.java | 98 ++++++++++++++++--- 2 files changed, 93 insertions(+), 77 deletions(-) diff --git a/src/main/java/com/cedarsoftware/util/convert/Converter.java b/src/main/java/com/cedarsoftware/util/convert/Converter.java index ab8b79c28..1a4c263b6 100644 --- a/src/main/java/com/cedarsoftware/util/convert/Converter.java +++ b/src/main/java/com/cedarsoftware/util/convert/Converter.java @@ -14,7 +14,6 @@ import java.time.MonthDay; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; -import java.time.temporal.TemporalAccessor; import java.util.AbstractMap; import java.util.Calendar; import java.util.Date; @@ -32,8 +31,6 @@ import java.util.concurrent.atomic.AtomicLong; import com.cedarsoftware.util.ClassUtilities; -import com.cedarsoftware.util.DateUtilities; -import com.cedarsoftware.util.StringUtilities; /** * Instance conversion utility. Convert from primitive to other primitives, plus support for Number, Date, @@ -459,14 +456,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Calendar.class, Timestamp.class), CalendarConversions::toTimestamp); DEFAULT_FACTORY.put(pair(Number.class, Timestamp.class), NumberConversions::toTimestamp); DEFAULT_FACTORY.put(pair(Map.class, Timestamp.class), MapConversions::toTimestamp); - DEFAULT_FACTORY.put(pair(String.class, Timestamp.class), (fromInstance, converter, options) -> { - String str = ((String) fromInstance).trim(); - Date date = DateUtilities.parseDate(str); - if (date == null) { - return null; - } - return new Timestamp(date.getTime()); - }); + DEFAULT_FACTORY.put(pair(String.class, Timestamp.class), StringConversions::toTimestamp); // Calendar conversions supported DEFAULT_FACTORY.put(pair(Void.class, Calendar.class), VoidConversions::toNull); @@ -485,14 +475,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Calendar.class, Calendar.class), CalendarConversions::clone); DEFAULT_FACTORY.put(pair(Number.class, Calendar.class), NumberConversions::toCalendar); DEFAULT_FACTORY.put(pair(Map.class, Calendar.class), MapConversions::toCalendar); - DEFAULT_FACTORY.put(pair(String.class, Calendar.class), (fromInstance, converter, options) -> { - String str = ((String) fromInstance).trim(); - Date date = DateUtilities.parseDate(str); - if (date == null) { - return null; - } - return CalendarConversions.create(date.getTime(), options); - }); + DEFAULT_FACTORY.put(pair(String.class, Calendar.class), StringConversions::toCalendar); // LocalDate conversions supported DEFAULT_FACTORY.put(pair(Void.class, LocalDate.class), VoidConversions::toNull); @@ -511,23 +494,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Calendar.class, LocalDate.class), CalendarConversions::toLocalDate); DEFAULT_FACTORY.put(pair(Number.class, LocalDate.class), NumberConversions::toLocalDate); DEFAULT_FACTORY.put(pair(Map.class, LocalDate.class), MapConversions::toLocalDate); - DEFAULT_FACTORY.put(pair(String.class, LocalDate.class), (fromInstance, converter, options) -> { - String str = (String) fromInstance; - if (StringUtilities.isEmpty(str)) { - return null; - } - TemporalAccessor dateTime = DateUtilities.parseDate(str, options.getZoneId(), true); - - Instant instant; - if (dateTime instanceof LocalDateTime) { - LocalDateTime localDateTime = LocalDateTime.from(dateTime); - instant = localDateTime.atZone(options.getZoneId()).toInstant(); - } else { - instant = Instant.from(dateTime); - } - // Bring the zonedDateTime to a user-specifiable timezone - return instant.atZone(options.getSourceZoneIdForLocalDates()).toLocalDate(); - }); + DEFAULT_FACTORY.put(pair(String.class, LocalDate.class), StringConversions::toLocalDate); // LocalDateTime conversions supported DEFAULT_FACTORY.put(pair(Void.class, LocalDateTime.class), VoidConversions::toNull); @@ -546,22 +513,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Calendar.class, LocalDateTime.class), CalendarConversions::toLocalDateTime); DEFAULT_FACTORY.put(pair(Number.class, LocalDateTime.class), NumberConversions::toLocalDateTime); DEFAULT_FACTORY.put(pair(Map.class, LocalDateTime.class), MapConversions::toLocalDateTime); - DEFAULT_FACTORY.put(pair(String.class, LocalDateTime.class), (fromInstance, converter, options) -> { - String str = (String) fromInstance; - if (StringUtilities.isEmpty(str)) { - return null; - } - TemporalAccessor dateTime = DateUtilities.parseDate(str, options.getZoneId(), true); - Instant instant; - if (dateTime instanceof LocalDateTime) { - LocalDateTime localDateTime = LocalDateTime.from(dateTime); - instant = localDateTime.atZone(options.getZoneId()).toInstant(); - } else { - instant = Instant.from(dateTime); - } - // Bring the zonedDateTime to a user-specifiable timezone - return instant.atZone(options.getSourceZoneIdForLocalDates()).toLocalDateTime(); - }); + DEFAULT_FACTORY.put(pair(String.class, LocalDateTime.class), StringConversions::toLocalDateTime); // LocalTime conversions supported DEFAULT_FACTORY.put(pair(Void.class, LocalTime.class), VoidConversions::toNull); @@ -581,13 +533,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Calendar.class, LocalTime.class), CalendarConversions::toLocalTime); DEFAULT_FACTORY.put(pair(Number.class, LocalTime.class), NumberConversions::toLocalTime); DEFAULT_FACTORY.put(pair(Map.class, LocalTime.class), MapConversions::toLocalTime); - DEFAULT_FACTORY.put(pair(String.class, LocalTime.class), (fromInstance, converter, options) -> { - String str = (String) fromInstance; - if (StringUtilities.isEmpty(str)) { - return null; - } - return LocalTime.parse(str); - }); + DEFAULT_FACTORY.put(pair(String.class, LocalTime.class), StringConversions::toLocalTime); // ZonedDateTime conversions supported DEFAULT_FACTORY.put(pair(Void.class, ZonedDateTime.class), VoidConversions::toNull); @@ -606,13 +552,7 @@ private static void buildFactoryConversions() { DEFAULT_FACTORY.put(pair(Calendar.class, ZonedDateTime.class), CalendarConversions::toZonedDateTime); DEFAULT_FACTORY.put(pair(Number.class, ZonedDateTime.class), NumberConversions::toZonedDateTime); DEFAULT_FACTORY.put(pair(Map.class, ZonedDateTime.class), MapConversions::toZonedDateTime); - DEFAULT_FACTORY.put(pair(String.class, ZonedDateTime.class), (fromInstance, converter, options) -> { - String str = (String) fromInstance; - if (StringUtilities.isEmpty(str)) { - return null; - } - return DateUtilities.parseDate(str, options.getZoneId(), true); - }); + DEFAULT_FACTORY.put(pair(String.class, ZonedDateTime.class), StringConversions::toZonedDateTime); // UUID conversions supported DEFAULT_FACTORY.put(pair(Void.class, UUID.class), VoidConversions::toNull); diff --git a/src/main/java/com/cedarsoftware/util/convert/StringConversions.java b/src/main/java/com/cedarsoftware/util/convert/StringConversions.java index 7ac1a4887..ddd7ddb0d 100644 --- a/src/main/java/com/cedarsoftware/util/convert/StringConversions.java +++ b/src/main/java/com/cedarsoftware/util/convert/StringConversions.java @@ -5,6 +5,12 @@ import java.math.RoundingMode; import java.sql.Timestamp; import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZonedDateTime; +import java.time.temporal.TemporalAccessor; +import java.util.Calendar; import java.util.Date; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -180,7 +186,7 @@ private static Boolean toBoolean(String from) { } else if ("false".equals(str)) { return false; } - return "true".equalsIgnoreCase(str) || "t".equalsIgnoreCase(str) || "1".equalsIgnoreCase(str) || "y".equalsIgnoreCase(str); + return "true".equalsIgnoreCase(str) || "t".equalsIgnoreCase(str) || "1".equals(str) || "y".equalsIgnoreCase(str); } static Boolean toBoolean(Object from, Converter converter, ConverterOptions options) { @@ -224,22 +230,75 @@ static BigDecimal toBigDecimal(Object from, Converter converter, ConverterOption } } + static Date toDate(Object from, Converter converter, ConverterOptions options) { + Instant instant = getInstant((String) from, options); + if (instant == null) { + return null; + } + // Bring the zonedDateTime to a user-specifiable timezone + return Date.from(instant); + } + static java.sql.Date toSqlDate(Object from, Converter converter, ConverterOptions options) { - String str = StringUtilities.trimToNull((String)from); - Date date = DateUtilities.parseDate(str); - return date == null ? null : new java.sql.Date(date.getTime()); + Instant instant = getInstant((String) from, options); + if (instant == null) { + return null; + } + Date date = Date.from(instant); + // Bring the zonedDateTime to a user-specifiable timezone + return new java.sql.Date(date.getTime()); } static Timestamp toTimestamp(Object from, Converter converter, ConverterOptions options) { - String str = StringUtilities.trimToNull((String)from); - Date date = DateUtilities.parseDate(str); - return date == null ? null : new Timestamp(date.getTime()); + Instant instant = getInstant((String) from, options); + if (instant == null) { + return null; + } + // Bring the zonedDateTime to a user-specifiable timezone + return Timestamp.from(instant); } - static Date toDate(Object from, Converter converter, ConverterOptions options) { - String str = StringUtilities.trimToNull((String)from); - Date date = DateUtilities.parseDate(str); - return date; + static Calendar toCalendar(Object from, Converter converter, ConverterOptions options) { + Instant instant = getInstant((String) from, options); + if (instant == null) { + return null; + } + Date date = Date.from(instant); + return CalendarConversions.create(date.getTime(), options); + } + + static LocalDate toLocalDate(Object from, Converter converter, ConverterOptions options) { + Instant instant = getInstant((String) from, options); + if (instant == null) { + return null; + } + // Bring the LocalDate to a user-specifiable timezone + return instant.atZone(options.getSourceZoneIdForLocalDates()).toLocalDate(); + } + + static LocalDateTime toLocalDateTime(Object from, Converter converter, ConverterOptions options) { + Instant instant = getInstant((String) from, options); + if (instant == null) { + return null; + } + // Bring the LocalDateTime to a user-specifiable timezone + return instant.atZone(options.getSourceZoneIdForLocalDates()).toLocalDateTime(); + } + + static LocalTime toLocalTime(Object from, Converter converter, ConverterOptions options) { + String str = (String) from; + if (StringUtilities.isEmpty(str)) { + return null; + } + return LocalTime.parse(str); + } + + static ZonedDateTime toZonedDateTime(Object from, Converter converter, ConverterOptions options) { + Instant instant = getInstant((String) from, options); + if (instant == null) { + return null; + } + return ZonedDateTime.ofInstant(instant, options.getZoneId()); } static Instant toInstant(Object from, Converter converter, ConverterOptions options) { @@ -256,6 +315,23 @@ static Instant toInstant(Object from, Converter converter, ConverterOptions opti } } + private static Instant getInstant(String from, ConverterOptions options) { + String str = StringUtilities.trimToNull(from); + if (str == null) { + return null; + } + TemporalAccessor dateTime = DateUtilities.parseDate(str, options.getZoneId(), true); + + Instant instant; + if (dateTime instanceof LocalDateTime) { + LocalDateTime localDateTime = LocalDateTime.from(dateTime); + instant = localDateTime.atZone(options.getZoneId()).toInstant(); + } else { + instant = Instant.from(dateTime); + } + return instant; + } + static String toString(Object from, Converter converter, ConverterOptions options) { return from.toString(); }