diff --git a/src/main/java/com/cedarsoftware/util/convert/BigDecimalConversions.java b/src/main/java/com/cedarsoftware/util/convert/BigDecimalConversions.java index e4e11f36..45879ab6 100644 --- a/src/main/java/com/cedarsoftware/util/convert/BigDecimalConversions.java +++ b/src/main/java/com/cedarsoftware/util/convert/BigDecimalConversions.java @@ -5,6 +5,7 @@ import java.sql.Timestamp; import java.time.Instant; import java.time.LocalDateTime; +import java.time.OffsetDateTime; import java.time.ZonedDateTime; import java.util.UUID; @@ -39,6 +40,10 @@ static LocalDateTime toLocalDateTime(Object from, Converter converter) { return toZonedDateTime(from, converter).toLocalDateTime(); } + static OffsetDateTime toOffsetDateTime(Object from, Converter converter) { + return toZonedDateTime(from, converter).toOffsetDateTime(); + } + static ZonedDateTime toZonedDateTime(Object from, Converter converter) { return toInstant(from, converter).atZone(converter.getOptions().getZoneId()); } diff --git a/src/main/java/com/cedarsoftware/util/convert/BigIntegerConversions.java b/src/main/java/com/cedarsoftware/util/convert/BigIntegerConversions.java index c5e53947..78c4ae6b 100644 --- a/src/main/java/com/cedarsoftware/util/convert/BigIntegerConversions.java +++ b/src/main/java/com/cedarsoftware/util/convert/BigIntegerConversions.java @@ -5,6 +5,9 @@ import java.sql.Timestamp; import java.time.Duration; import java.time.Instant; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZonedDateTime; import java.util.UUID; /** @@ -61,24 +64,22 @@ static UUID toUUID(Object from, Converter converter) { return UUID.fromString(uuidString); } - /** - * Epoch nanos to Timestamp - */ static Timestamp toTimestamp(Object from, Converter converter) { - BigInteger nanoseconds = (BigInteger) from; - Duration duration = toDuration(nanoseconds, converter); - Instant epoch = Instant.EPOCH; + return Timestamp.from(toInstant(from, converter)); + } - // Add the duration to the epoch - Instant timestampInstant = epoch.plus(duration); + static ZonedDateTime toZonedDateTime(Object from, Converter converter) { + return toInstant(from, converter).atZone(converter.getOptions().getZoneId()); + } + + static LocalDateTime toLocalDateTime(Object from, Converter converter) { + return toZonedDateTime(from, converter).toLocalDateTime(); + } - // Convert Instant to Timestamp - return Timestamp.from(timestampInstant); + static OffsetDateTime toOffsetDateTime(Object from, Converter converter) { + return toZonedDateTime(from, converter).toOffsetDateTime(); } - /** - * Epoch nanos to Instant - */ static Instant toInstant(Object from, Converter converter) { BigInteger nanoseconds = (BigInteger) from; BigInteger[] secondsAndNanos = nanoseconds.divideAndRemainder(BILLION); @@ -87,9 +88,6 @@ static Instant toInstant(Object from, Converter converter) { return Instant.ofEpochSecond(seconds, nanos); } - /** - * Epoch nanos to Duration - */ static Duration toDuration(Object from, Converter converter) { BigInteger nanoseconds = (BigInteger) from; BigInteger[] secondsAndNanos = nanoseconds.divideAndRemainder(BILLION); diff --git a/src/main/java/com/cedarsoftware/util/convert/Converter.java b/src/main/java/com/cedarsoftware/util/convert/Converter.java index 9da07f91..d06c5a14 100644 --- a/src/main/java/com/cedarsoftware/util/convert/Converter.java +++ b/src/main/java/com/cedarsoftware/util/convert/Converter.java @@ -228,6 +228,7 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(LocalDate.class, Double.class), LocalDateConversions::toDouble); CONVERSION_DB.put(pair(LocalDateTime.class, Double.class), LocalDateTimeConversions::toDouble); CONVERSION_DB.put(pair(ZonedDateTime.class, Double.class), ZonedDateTimeConversions::toDouble); + CONVERSION_DB.put(pair(OffsetDateTime.class, Double.class), OffsetDateTimeConversions::toDouble); CONVERSION_DB.put(pair(Date.class, Double.class), DateConversions::toDouble); CONVERSION_DB.put(pair(java.sql.Date.class, Double.class), DateConversions::toDouble); CONVERSION_DB.put(pair(Timestamp.class, Double.class), TimestampConversions::toDouble); @@ -305,12 +306,12 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(LocalDate.class, BigInteger.class), LocalDateConversions::toBigInteger); CONVERSION_DB.put(pair(LocalDateTime.class, BigInteger.class), LocalDateTimeConversions::toBigInteger); CONVERSION_DB.put(pair(ZonedDateTime.class, BigInteger.class), ZonedDateTimeConversions::toBigInteger); + CONVERSION_DB.put(pair(OffsetDateTime.class, BigInteger.class), OffsetDateTimeConversions::toBigInteger); CONVERSION_DB.put(pair(UUID.class, BigInteger.class), UUIDConversions::toBigInteger); CONVERSION_DB.put(pair(Calendar.class, BigInteger.class), CalendarConversions::toBigInteger); CONVERSION_DB.put(pair(Number.class, BigInteger.class), NumberConversions::toBigInteger); CONVERSION_DB.put(pair(Map.class, BigInteger.class), MapConversions::toBigInteger); CONVERSION_DB.put(pair(String.class, BigInteger.class), StringConversions::toBigInteger); - CONVERSION_DB.put(pair(OffsetDateTime.class, BigInteger.class), OffsetDateTimeConversions::toBigInteger); CONVERSION_DB.put(pair(Year.class, BigInteger.class), YearConversions::toBigInteger); // BigDecimal conversions supported @@ -335,12 +336,12 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(LocalDate.class, BigDecimal.class), LocalDateConversions::toBigDecimal); CONVERSION_DB.put(pair(LocalDateTime.class, BigDecimal.class), LocalDateTimeConversions::toBigDecimal); CONVERSION_DB.put(pair(ZonedDateTime.class, BigDecimal.class), ZonedDateTimeConversions::toBigDecimal); + CONVERSION_DB.put(pair(OffsetDateTime.class, BigDecimal.class), OffsetDateTimeConversions::toBigDecimal); CONVERSION_DB.put(pair(UUID.class, BigDecimal.class), UUIDConversions::toBigDecimal); CONVERSION_DB.put(pair(Calendar.class, BigDecimal.class), CalendarConversions::toBigDecimal); CONVERSION_DB.put(pair(Number.class, BigDecimal.class), NumberConversions::toBigDecimal); CONVERSION_DB.put(pair(Map.class, BigDecimal.class), MapConversions::toBigDecimal); CONVERSION_DB.put(pair(String.class, BigDecimal.class), StringConversions::toBigDecimal); - CONVERSION_DB.put(pair(OffsetDateTime.class, BigDecimal.class), OffsetDateTimeConversions::toBigDecimal); CONVERSION_DB.put(pair(Year.class, BigDecimal.class), YearConversions::toBigDecimal); // AtomicBoolean conversions supported @@ -406,11 +407,11 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(LocalDate.class, AtomicLong.class), LocalDateConversions::toAtomicLong); CONVERSION_DB.put(pair(LocalDateTime.class, AtomicLong.class), LocalDateTimeConversions::toAtomicLong); CONVERSION_DB.put(pair(ZonedDateTime.class, AtomicLong.class), ZonedDateTimeConversions::toAtomicLong); + CONVERSION_DB.put(pair(OffsetDateTime.class, AtomicLong.class), OffsetDateTimeConversions::toAtomicLong); CONVERSION_DB.put(pair(Calendar.class, AtomicLong.class), CalendarConversions::toAtomicLong); CONVERSION_DB.put(pair(Number.class, AtomicLong.class), NumberConversions::toAtomicLong); CONVERSION_DB.put(pair(Map.class, AtomicLong.class), MapConversions::toAtomicLong); CONVERSION_DB.put(pair(String.class, AtomicLong.class), StringConversions::toAtomicLong); - CONVERSION_DB.put(pair(OffsetDateTime.class, AtomicLong.class), OffsetDateTimeConversions::toAtomicLong); CONVERSION_DB.put(pair(Year.class, AtomicLong.class), YearConversions::toAtomicLong); // Date conversions supported @@ -431,11 +432,11 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(LocalDate.class, Date.class), LocalDateConversions::toDate); CONVERSION_DB.put(pair(LocalDateTime.class, Date.class), LocalDateTimeConversions::toDate); CONVERSION_DB.put(pair(ZonedDateTime.class, Date.class), ZonedDateTimeConversions::toDate); + CONVERSION_DB.put(pair(OffsetDateTime.class, Date.class), OffsetDateTimeConversions::toDate); CONVERSION_DB.put(pair(Calendar.class, Date.class), CalendarConversions::toDate); CONVERSION_DB.put(pair(Number.class, Date.class), NumberConversions::toDate); CONVERSION_DB.put(pair(Map.class, Date.class), MapConversions::toDate); CONVERSION_DB.put(pair(String.class, Date.class), StringConversions::toDate); - CONVERSION_DB.put(pair(OffsetDateTime.class, Date.class), OffsetDateTimeConversions::toDate); // java.sql.Date conversion supported CONVERSION_DB.put(pair(Void.class, java.sql.Date.class), VoidConversions::toNull); @@ -455,11 +456,11 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(LocalDate.class, java.sql.Date.class), LocalDateConversions::toSqlDate); CONVERSION_DB.put(pair(LocalDateTime.class, java.sql.Date.class), LocalDateTimeConversions::toSqlDate); CONVERSION_DB.put(pair(ZonedDateTime.class, java.sql.Date.class), ZonedDateTimeConversions::toSqlDate); + CONVERSION_DB.put(pair(OffsetDateTime.class, java.sql.Date.class), OffsetDateTimeConversions::toSqlDate); CONVERSION_DB.put(pair(Calendar.class, java.sql.Date.class), CalendarConversions::toSqlDate); CONVERSION_DB.put(pair(Number.class, java.sql.Date.class), NumberConversions::toSqlDate); CONVERSION_DB.put(pair(Map.class, java.sql.Date.class), MapConversions::toSqlDate); CONVERSION_DB.put(pair(String.class, java.sql.Date.class), StringConversions::toSqlDate); - CONVERSION_DB.put(pair(OffsetDateTime.class, java.sql.Date.class), OffsetDateTimeConversions::toSqlDate); // Timestamp conversions supported CONVERSION_DB.put(pair(Void.class, Timestamp.class), VoidConversions::toNull); @@ -480,11 +481,11 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(LocalDate.class, Timestamp.class), LocalDateConversions::toTimestamp); CONVERSION_DB.put(pair(LocalDateTime.class, Timestamp.class), LocalDateTimeConversions::toTimestamp); CONVERSION_DB.put(pair(ZonedDateTime.class, Timestamp.class), ZonedDateTimeConversions::toTimestamp); + CONVERSION_DB.put(pair(OffsetDateTime.class, Timestamp.class), OffsetDateTimeConversions::toTimestamp); CONVERSION_DB.put(pair(Calendar.class, Timestamp.class), CalendarConversions::toTimestamp); CONVERSION_DB.put(pair(Number.class, Timestamp.class), NumberConversions::toTimestamp); CONVERSION_DB.put(pair(Map.class, Timestamp.class), MapConversions::toTimestamp); CONVERSION_DB.put(pair(String.class, Timestamp.class), StringConversions::toTimestamp); - CONVERSION_DB.put(pair(OffsetDateTime.class, Timestamp.class), OffsetDateTimeConversions::toTimestamp); // Calendar conversions supported CONVERSION_DB.put(pair(Void.class, Calendar.class), VoidConversions::toNull); @@ -504,11 +505,11 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(LocalDate.class, Calendar.class), LocalDateConversions::toCalendar); CONVERSION_DB.put(pair(LocalDateTime.class, Calendar.class), LocalDateTimeConversions::toCalendar); CONVERSION_DB.put(pair(ZonedDateTime.class, Calendar.class), ZonedDateTimeConversions::toCalendar); + CONVERSION_DB.put(pair(OffsetDateTime.class, Calendar.class), OffsetDateTimeConversions::toCalendar); CONVERSION_DB.put(pair(Calendar.class, Calendar.class), CalendarConversions::clone); CONVERSION_DB.put(pair(Number.class, Calendar.class), NumberConversions::toCalendar); CONVERSION_DB.put(pair(Map.class, Calendar.class), MapConversions::toCalendar); CONVERSION_DB.put(pair(String.class, Calendar.class), StringConversions::toCalendar); - CONVERSION_DB.put(pair(OffsetDateTime.class, Calendar.class), OffsetDateTimeConversions::toCalendar); // LocalDate conversions supported CONVERSION_DB.put(pair(Void.class, LocalDate.class), VoidConversions::toNull); @@ -528,11 +529,11 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(LocalDate.class, LocalDate.class), LocalDateConversions::toLocalDate); CONVERSION_DB.put(pair(LocalDateTime.class, LocalDate.class), LocalDateTimeConversions::toLocalDate); CONVERSION_DB.put(pair(ZonedDateTime.class, LocalDate.class), ZonedDateTimeConversions::toLocalDate); + CONVERSION_DB.put(pair(OffsetDateTime.class, LocalDate.class), OffsetDateTimeConversions::toLocalDate); CONVERSION_DB.put(pair(Calendar.class, LocalDate.class), CalendarConversions::toLocalDate); CONVERSION_DB.put(pair(Number.class, LocalDate.class), NumberConversions::toLocalDate); CONVERSION_DB.put(pair(Map.class, LocalDate.class), MapConversions::toLocalDate); CONVERSION_DB.put(pair(String.class, LocalDate.class), StringConversions::toLocalDate); - CONVERSION_DB.put(pair(OffsetDateTime.class, LocalDate.class), OffsetDateTimeConversions::toLocalDate); // LocalDateTime conversions supported CONVERSION_DB.put(pair(Void.class, LocalDateTime.class), VoidConversions::toNull); @@ -541,7 +542,7 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(Integer.class, LocalDateTime.class), UNSUPPORTED); CONVERSION_DB.put(pair(Long.class, LocalDateTime.class), NumberConversions::toLocalDateTime); CONVERSION_DB.put(pair(Double.class, LocalDateTime.class), DoubleConversions::toLocalDateTime); - CONVERSION_DB.put(pair(BigInteger.class, LocalDateTime.class), NumberConversions::toLocalDateTime); + CONVERSION_DB.put(pair(BigInteger.class, LocalDateTime.class), BigIntegerConversions::toLocalDateTime); CONVERSION_DB.put(pair(BigDecimal.class, LocalDateTime.class), BigDecimalConversions::toLocalDateTime); CONVERSION_DB.put(pair(AtomicInteger.class, LocalDateTime.class), UNSUPPORTED); CONVERSION_DB.put(pair(AtomicLong.class, LocalDateTime.class), NumberConversions::toLocalDateTime); @@ -552,11 +553,11 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(LocalDateTime.class, LocalDateTime.class), LocalDateTimeConversions::toLocalDateTime); CONVERSION_DB.put(pair(LocalDate.class, LocalDateTime.class), LocalDateConversions::toLocalDateTime); CONVERSION_DB.put(pair(ZonedDateTime.class, LocalDateTime.class), ZonedDateTimeConversions::toLocalDateTime); + CONVERSION_DB.put(pair(OffsetDateTime.class, LocalDateTime.class), OffsetDateTimeConversions::toLocalDateTime); CONVERSION_DB.put(pair(Calendar.class, LocalDateTime.class), CalendarConversions::toLocalDateTime); CONVERSION_DB.put(pair(Number.class, LocalDateTime.class), NumberConversions::toLocalDateTime); CONVERSION_DB.put(pair(Map.class, LocalDateTime.class), MapConversions::toLocalDateTime); CONVERSION_DB.put(pair(String.class, LocalDateTime.class), StringConversions::toLocalDateTime); - CONVERSION_DB.put(pair(OffsetDateTime.class, LocalDateTime.class), OffsetDateTimeConversions::toLocalDateTime); // LocalTime conversions supported CONVERSION_DB.put(pair(Void.class, LocalTime.class), VoidConversions::toNull); @@ -577,11 +578,11 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(LocalDate.class, LocalTime.class), LocalDateConversions::toLocalTime); CONVERSION_DB.put(pair(LocalTime.class, LocalTime.class), Converter::identity); CONVERSION_DB.put(pair(ZonedDateTime.class, LocalTime.class), ZonedDateTimeConversions::toLocalTime); + CONVERSION_DB.put(pair(OffsetDateTime.class, LocalTime.class), OffsetDateTimeConversions::toLocalTime); CONVERSION_DB.put(pair(Calendar.class, LocalTime.class), CalendarConversions::toLocalTime); CONVERSION_DB.put(pair(Number.class, LocalTime.class), NumberConversions::toLocalTime); CONVERSION_DB.put(pair(Map.class, LocalTime.class), MapConversions::toLocalTime); CONVERSION_DB.put(pair(String.class, LocalTime.class), StringConversions::toLocalTime); - CONVERSION_DB.put(pair(OffsetDateTime.class, LocalTime.class), OffsetDateTimeConversions::toLocalTime); // ZonedDateTime conversions supported CONVERSION_DB.put(pair(Void.class, ZonedDateTime.class), VoidConversions::toNull); @@ -590,7 +591,7 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(Integer.class, ZonedDateTime.class), UNSUPPORTED); CONVERSION_DB.put(pair(Long.class, ZonedDateTime.class), NumberConversions::toZonedDateTime); CONVERSION_DB.put(pair(Double.class, ZonedDateTime.class), DoubleConversions::toZonedDateTime); - CONVERSION_DB.put(pair(BigInteger.class, ZonedDateTime.class), NumberConversions::toZonedDateTime); + CONVERSION_DB.put(pair(BigInteger.class, ZonedDateTime.class), BigIntegerConversions::toZonedDateTime); CONVERSION_DB.put(pair(BigDecimal.class, ZonedDateTime.class), BigDecimalConversions::toZonedDateTime); CONVERSION_DB.put(pair(AtomicInteger.class, ZonedDateTime.class), UNSUPPORTED); CONVERSION_DB.put(pair(AtomicLong.class, ZonedDateTime.class), NumberConversions::toZonedDateTime); @@ -601,6 +602,7 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(LocalDate.class, ZonedDateTime.class), LocalDateConversions::toZonedDateTime); CONVERSION_DB.put(pair(LocalDateTime.class, ZonedDateTime.class), LocalDateTimeConversions::toZonedDateTime); CONVERSION_DB.put(pair(ZonedDateTime.class, ZonedDateTime.class), Converter::identity); + CONVERSION_DB.put(pair(OffsetDateTime.class, ZonedDateTime.class), OffsetDateTimeConversions::toZonedDateTime); CONVERSION_DB.put(pair(Calendar.class, ZonedDateTime.class), CalendarConversions::toZonedDateTime); CONVERSION_DB.put(pair(Number.class, ZonedDateTime.class), NumberConversions::toZonedDateTime); CONVERSION_DB.put(pair(Map.class, ZonedDateTime.class), MapConversions::toZonedDateTime); @@ -612,6 +614,9 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(Map.class, OffsetDateTime.class), MapConversions::toOffsetDateTime); CONVERSION_DB.put(pair(String.class, OffsetDateTime.class), StringConversions::toOffsetDateTime); CONVERSION_DB.put(pair(Long.class, OffsetDateTime.class), NumberConversions::toOffsetDateTime); + CONVERSION_DB.put(pair(BigInteger.class, OffsetDateTime.class), BigIntegerConversions::toOffsetDateTime); + CONVERSION_DB.put(pair(BigDecimal.class, OffsetDateTime.class), BigDecimalConversions::toOffsetDateTime); + CONVERSION_DB.put(pair(ZonedDateTime.class, OffsetDateTime.class), ZonedDateTimeConversions::toOffsetDateTime); // toOffsetTime CONVERSION_DB.put(pair(Void.class, OffsetTime.class), VoidConversions::toNull); @@ -634,7 +639,7 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(Map.class, Class.class), MapConversions::toClass); CONVERSION_DB.put(pair(String.class, Class.class), StringConversions::toClass); - // Class conversions supported + // Locale conversions supported CONVERSION_DB.put(pair(Void.class, Locale.class), VoidConversions::toNull); CONVERSION_DB.put(pair(Locale.class, Locale.class), Converter::identity); CONVERSION_DB.put(pair(String.class, Locale.class), StringConversions::toLocale); @@ -743,11 +748,11 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(LocalDate.class, Instant.class), LocalDateConversions::toInstant); CONVERSION_DB.put(pair(LocalDateTime.class, Instant.class), LocalDateTimeConversions::toInstant); CONVERSION_DB.put(pair(ZonedDateTime.class, Instant.class), ZonedDateTimeConversions::toInstant); + CONVERSION_DB.put(pair(OffsetDateTime.class, Instant.class), OffsetDateTimeConversions::toInstant); CONVERSION_DB.put(pair(Calendar.class, Instant.class), CalendarConversions::toInstant); CONVERSION_DB.put(pair(Number.class, Instant.class), NumberConversions::toInstant); CONVERSION_DB.put(pair(String.class, Instant.class), StringConversions::toInstant); CONVERSION_DB.put(pair(Map.class, Instant.class), MapConversions::toInstant); - CONVERSION_DB.put(pair(OffsetDateTime.class, Instant.class), OffsetDateTimeConversions::toInstant); // ZoneId conversions supported CONVERSION_DB.put(pair(Void.class, ZoneId.class), VoidConversions::toNull); diff --git a/src/main/java/com/cedarsoftware/util/convert/OffsetDateTimeConversions.java b/src/main/java/com/cedarsoftware/util/convert/OffsetDateTimeConversions.java index 707b70a6..7e466e4a 100644 --- a/src/main/java/com/cedarsoftware/util/convert/OffsetDateTimeConversions.java +++ b/src/main/java/com/cedarsoftware/util/convert/OffsetDateTimeConversions.java @@ -10,6 +10,7 @@ import java.time.OffsetDateTime; import java.time.OffsetTime; import java.time.ZoneOffset; +import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; @@ -36,26 +37,27 @@ * limitations under the License. */ final class OffsetDateTimeConversions { - private OffsetDateTimeConversions() {} + private OffsetDateTimeConversions() { + } static Instant toInstant(Object from, Converter converter) { - return ((OffsetDateTime)from).toInstant(); + return ((OffsetDateTime) from).toInstant(); } static long toLong(Object from, Converter converter) { return toInstant(from, converter).toEpochMilli(); } - + static LocalDateTime toLocalDateTime(Object from, Converter converter) { - return ((OffsetDateTime)from).toLocalDateTime(); + return toZonedDateTime(from, converter).toLocalDateTime(); } static LocalDate toLocalDate(Object from, Converter converter) { - return ((OffsetDateTime)from).toLocalDate(); + return toZonedDateTime(from, converter).toLocalDate(); } static LocalTime toLocalTime(Object from, Converter converter) { - return ((OffsetDateTime)from).toLocalTime(); + return toZonedDateTime(from, converter).toLocalTime(); } static AtomicLong toAtomicLong(Object from, Converter converter) { @@ -76,6 +78,11 @@ static java.sql.Date toSqlDate(Object from, Converter converter) { return new java.sql.Date(toLong(from, converter)); } + static ZonedDateTime toZonedDateTime(Object from, Converter converter) { + return ((OffsetDateTime) from).toInstant().atZone(converter.getOptions().getZoneId()); +// return ((OffsetDateTime) from).atZoneSameInstant(converter.getOptions().getZoneId()); + } + static Date toDate(Object from, Converter converter) { return new Date(toLong(from, converter)); } @@ -109,4 +116,8 @@ static Map toMap(Object from, Converter converter) { target.put(MapConversions.OFFSET, converter.convert(zoneOffset, String.class)); return target; } + + static double toDouble(Object from, Converter converter) { + throw new UnsupportedOperationException("This needs to be implemented"); + } } diff --git a/src/main/java/com/cedarsoftware/util/convert/ZonedDateTimeConversions.java b/src/main/java/com/cedarsoftware/util/convert/ZonedDateTimeConversions.java index 0eaee542..1edd2ff2 100644 --- a/src/main/java/com/cedarsoftware/util/convert/ZonedDateTimeConversions.java +++ b/src/main/java/com/cedarsoftware/util/convert/ZonedDateTimeConversions.java @@ -7,6 +7,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Calendar; @@ -64,6 +65,11 @@ static LocalTime toLocalTime(Object from, Converter converter) { return toDifferentZone(from, converter).toLocalTime(); // shorter code over speed } + static OffsetDateTime toOffsetDateTime(Object from, Converter converter) { + ZonedDateTime zdt = (ZonedDateTime) from; + return zdt.toOffsetDateTime(); + } + static AtomicLong toAtomicLong(Object from, Converter converter) { return new AtomicLong(toLong(from, converter)); } diff --git a/src/test/java/com/cedarsoftware/util/convert/ConverterEverythingTest.java b/src/test/java/com/cedarsoftware/util/convert/ConverterEverythingTest.java index 5482aa18..3373b4ba 100644 --- a/src/test/java/com/cedarsoftware/util/convert/ConverterEverythingTest.java +++ b/src/test/java/com/cedarsoftware/util/convert/ConverterEverythingTest.java @@ -1828,6 +1828,16 @@ public ZoneId getZoneId() { // Timestamp ///////////////////////////////////////////////////////////// TEST_DB.put(pair(BigDecimal.class, Timestamp.class), new Object[][] { + { new BigDecimal("-62167219200000.000000"), Timestamp.from(ZonedDateTime.parse("0000-01-01T00:00:00Z").toInstant()), true }, + { new BigDecimal("-62167219199999.999999"), Timestamp.from(ZonedDateTime.parse("0000-01-01T00:00:00.000000001Z").toInstant()), true }, + { new BigDecimal("-1000.000001"), Timestamp.from(ZonedDateTime.parse("1969-12-31T23:59:58.999999999Z").toInstant()), true }, + { new BigDecimal("-1000.000000"), Timestamp.from(ZonedDateTime.parse("1969-12-31T23:59:59Z").toInstant()), true }, + { new BigDecimal("-0.000010"), Timestamp.from(ZonedDateTime.parse("1969-12-31T23:59:59.999999990Z").toInstant()), true }, + { new BigDecimal("-0.000001"), Timestamp.from(ZonedDateTime.parse("1969-12-31T23:59:59.999999999Z").toInstant()), true }, + { new BigDecimal("0.000000"), Timestamp.from(ZonedDateTime.parse("1970-01-01T00:00:00.000000000Z").toInstant()), true }, + { new BigDecimal("0.000001"), Timestamp.from(ZonedDateTime.parse("1970-01-01T00:00:00.000000001Z").toInstant()), true }, + { new BigDecimal("999.999999"), Timestamp.from(ZonedDateTime.parse("1970-01-01T00:00:00.999999999Z").toInstant()), true }, + { new BigDecimal("1000.000000"), Timestamp.from(ZonedDateTime.parse("1970-01-01T00:00:01.000000000Z").toInstant()), true }, { new BigDecimal("1708237915987.654321"), Timestamp.from(ZonedDateTime.parse("2024-02-18T06:31:55.987654321+00:00").toInstant()), true }, { new BigDecimal("1708237915123.456789"), Timestamp.from(ZonedDateTime.parse("2024-02-18T06:31:55.123456789+00:00").toInstant()), true }, }); diff --git a/src/test/java/com/cedarsoftware/util/convert/ConverterTest.java b/src/test/java/com/cedarsoftware/util/convert/ConverterTest.java index e92f4bc5..c7c69cd7 100644 --- a/src/test/java/com/cedarsoftware/util/convert/ConverterTest.java +++ b/src/test/java/com/cedarsoftware/util/convert/ConverterTest.java @@ -1172,17 +1172,6 @@ void testLongToInstant(long epochMilli, ZoneId zoneId, LocalDateTime expected) assertThat(actual).isEqualTo(Instant.ofEpochMilli(epochMilli)); } - @ParameterizedTest - @MethodSource("epochMillis_withLocalDateTimeInformation") - void testBigIntegerToLocalDateTime(long epochMilli, ZoneId zoneId, LocalDateTime expected) - { - BigInteger bi = BigInteger.valueOf(epochMilli); - - Converter converter = new Converter(createCustomZones(zoneId)); - LocalDateTime localDateTime = converter.convert(bi, LocalDateTime.class); - assertThat(localDateTime).isEqualTo(expected); - } - @ParameterizedTest @MethodSource("epochMillis_withLocalDateTimeInformation") void testBigDecimalToLocalDateTime(long epochMilli, ZoneId zoneId, LocalDateTime expected) @@ -1706,21 +1695,7 @@ void testLocalDateTimeToZonedDateTime(long epochMilli, ZoneId sourceZoneId, Loca LocalDateTime actual = converter.convert(intermediate, LocalDateTime.class); assertThat(actual).isEqualTo(expected); } - - @ParameterizedTest - @MethodSource("localDateTimeConversion_params") - void testLocalDateTimeToBigInteger(long epochMilli, ZoneId sourceZoneId, LocalDateTime initial, ZoneId targetZoneId, LocalDateTime expected) - { - Converter converter = new Converter(createCustomZones(sourceZoneId)); - BigInteger milli = converter.convert(initial, BigInteger.class); - assertThat(milli.longValue()).isEqualTo(epochMilli); - - converter = new Converter(createCustomZones(targetZoneId)); - LocalDateTime actual = converter.convert(milli, LocalDateTime.class); - assertThat(actual).isEqualTo(expected); - - } - + @ParameterizedTest @MethodSource("localDateTimeConversion_params") void testLocalDateTimeToBigDecimal(long epochMilli, ZoneId sourceZoneId, LocalDateTime initial, ZoneId targetZoneId, LocalDateTime expected)