Skip to content

Commit

Permalink
Updated all the LocalTime, LocalDate, LocalDateTime, ZonedDateTime to…
Browse files Browse the repository at this point in the history
… 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.
  • Loading branch information
jdereg committed Jan 28, 2024
1 parent 3bc048b commit c8fe646
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 77 deletions.
72 changes: 6 additions & 66 deletions src/main/java/com/cedarsoftware/util/convert/Converter.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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,
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand Down
98 changes: 87 additions & 11 deletions src/main/java/com/cedarsoftware/util/convert/StringConversions.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand All @@ -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();
}
Expand Down

0 comments on commit c8fe646

Please sign in to comment.