diff --git a/snack3/src/main/java/org/noear/snack/from/ObjectFromer.java b/snack3/src/main/java/org/noear/snack/from/ObjectFromer.java index 73dfa7e14487964412c536f617e3b713869a58f6..3eae4ab538b2ceca6969bc07fec0ef47538b6b64 100644 --- a/snack3/src/main/java/org/noear/snack/from/ObjectFromer.java +++ b/snack3/src/main/java/org/noear/snack/from/ObjectFromer.java @@ -78,6 +78,8 @@ public class ObjectFromer implements Fromer { rst.val().setDate((Date) source); } else if (source instanceof ZonedDateTime) { rst.val().setDate(Date.from(((ZonedDateTime) source).toInstant())); + }else if (source instanceof OffsetDateTime) { + rst.val().setDate(Date.from(((OffsetDateTime) source).toInstant())); } else if (source instanceof LocalDateTime) { Instant instant = ((LocalDateTime) source).atZone(DEFAULTS.DEF_TIME_ZONE.toZoneId()).toInstant(); rst.val().setDate(new Date((instant.getEpochSecond() * 1000) + (instant.getNano() / 1000_000))); diff --git a/snack3/src/main/java/org/noear/snack/to/ObjectToer.java b/snack3/src/main/java/org/noear/snack/to/ObjectToer.java index d519528d2c943639bae00c0f9182d2a8b78d4117..6b18a5fb21750cd871868cf424133de8eac5ab3e 100644 --- a/snack3/src/main/java/org/noear/snack/to/ObjectToer.java +++ b/snack3/src/main/java/org/noear/snack/to/ObjectToer.java @@ -18,10 +18,7 @@ import java.math.BigInteger; import java.net.InetSocketAddress; import java.nio.charset.Charset; import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.ZonedDateTime; +import java.time.*; import java.util.*; import java.util.concurrent.atomic.DoubleAdder; import java.util.concurrent.atomic.LongAdder; @@ -245,6 +242,13 @@ public class ObjectToer implements Toer { return new java.sql.Time(v.getLong()); } else if (is(Date.class, clz)) { return v.getDate(); + }else if (is(OffsetDateTime.class, clz)) { + Date date = v.getDate(); + if (null == date) { + return null; + } else { + return OffsetDateTime.ofInstant(date.toInstant(), DEFAULTS.DEF_TIME_ZONE.toZoneId()); + } }else if (is(ZonedDateTime.class, clz)) { Date date = v.getDate(); if (null == date) { diff --git a/snack3_demo/src/test/java/_models/DateModel2.java b/snack3_demo/src/test/java/_models/DateModel2.java index 6cc656143138ec633f8c17fa2f7f7b48c504bec4..bd0dfcd160830c3db2b5702e203185b8b6831b75 100644 --- a/snack3_demo/src/test/java/_models/DateModel2.java +++ b/snack3_demo/src/test/java/_models/DateModel2.java @@ -1,9 +1,6 @@ package _models; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.ZonedDateTime; +import java.time.*; import java.util.Date; /** @@ -20,4 +17,5 @@ public class DateModel2 { public Date date8; public LocalTime date9; public ZonedDateTime date10; + public OffsetDateTime date11; } diff --git a/snack3_demo/src/test/java/_models/OffsetDateTimeModel.java b/snack3_demo/src/test/java/_models/OffsetDateTimeModel.java new file mode 100644 index 0000000000000000000000000000000000000000..f7ada5a07c888e017b40593e4ed02841a14886a3 --- /dev/null +++ b/snack3_demo/src/test/java/_models/OffsetDateTimeModel.java @@ -0,0 +1,8 @@ +package _models; + +import java.time.OffsetDateTime; +import java.time.ZonedDateTime; + +public class OffsetDateTimeModel { + public OffsetDateTime date; +} diff --git a/snack3_demo/src/test/java/features/DateTest.java b/snack3_demo/src/test/java/features/DateTest.java index 28d62639d53e8a6fcf23d8f73ec82d158d923801..c98ea3c2603fe480ada5999055ab63c2bf682c2a 100644 --- a/snack3_demo/src/test/java/features/DateTest.java +++ b/snack3_demo/src/test/java/features/DateTest.java @@ -32,7 +32,7 @@ public class DateTest { @Test public void test3() { - String json = "{date1:'2021-06-13T20:54:51.566Z', date2:'2021-06-13T20:54:51', date3:'2021-06-13 20:54:51', date4:'20210613205451566+0800', date5:'2021-06-13', date6:'2021-06-13T20:54:51.566+08:00', date7:'2021-06-13 20:54:51,566', date8:'2021-06-13 20:54:51.566', date9:'20:54:51', date10:'2021-06-13T20:54:51.566+08:00'}"; + String json = "{date1:'2021-06-13T20:54:51.566Z', date2:'2021-06-13T20:54:51', date3:'2021-06-13 20:54:51', date4:'20210613205451566+0800', date5:'2021-06-13', date6:'2021-06-13T20:54:51.566+08:00', date7:'2021-06-13 20:54:51,566', date8:'2021-06-13 20:54:51.566', date9:'20:54:51', date10:'2021-06-13T20:54:51.566+08:00', date11:'2021-06-13T20:54:51.566+08:00'}"; DateModel dateModel0 = ONode.deserialize(json, DateModel.class); DateModel2 dateModel = ONode.deserialize(json, DateModel2.class); @@ -53,6 +53,7 @@ public class DateTest { assert dateModel.date8.equals(dateModel2.date8); assert dateModel.date9.equals(dateModel2.date9); assert dateModel.date10.equals(dateModel2.date10); + assert dateModel.date11.equals(dateModel2.date11); } @Test diff --git a/snack3_demo/src/test/java/features/OffsetDateTimeTest.java b/snack3_demo/src/test/java/features/OffsetDateTimeTest.java new file mode 100644 index 0000000000000000000000000000000000000000..7c883a44211468da5966ba47927f149f1b7fe674 --- /dev/null +++ b/snack3_demo/src/test/java/features/OffsetDateTimeTest.java @@ -0,0 +1,53 @@ +package features; + +import _models.OffsetDateTimeModel; +import _models.ZonedDateTimeModel; +import org.junit.Test; +import org.noear.snack.ONode; +import org.noear.snack.core.Context; +import org.noear.snack.core.Options; +import org.noear.snack.from.ObjectFromer; + +import java.time.OffsetDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +/** + * ZoneDateTime序列化测试 + * @author hans + */ +public class OffsetDateTimeTest { + + + /** + * 反序列化测试 + */ + @Test + public void deserialize() { + String poc = "{\"date\":\"2024-01-12T10:30:00.000+03:00\"}"; + ONode oNode = ONode.loadStr(poc); + //解析 + OffsetDateTimeModel model = oNode.toObject(OffsetDateTimeModel.class); + OffsetDateTime date = model.date; + OffsetDateTime offsetDateTime = date.withOffsetSameInstant(ZoneOffset.of("+03:00")); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + System.out.println(df.format(offsetDateTime)); + System.out.println(df.format(date)); + assert date.toInstant().equals(offsetDateTime.toInstant()); + } + + /** + * 序列化测试 + */ + @Test + public void serialize() { + OffsetDateTimeModel data = new OffsetDateTimeModel(); + data.date=OffsetDateTime.now(); + ObjectFromer objectFromer = new ObjectFromer(); + Context context = new Context(Options.def(), data); + objectFromer.handle(context); + assert context.source == data; + } +} \ No newline at end of file diff --git a/snack3_demo/src/test/java/features/ZonedDateTimeTest.java b/snack3_demo/src/test/java/features/ZonedDateTimeTest.java index ad53a68aa939020c13378a1c5f45d6b64099fe07..5b96218eae4ccdc1d822ae39cd3451700090027c 100644 --- a/snack3_demo/src/test/java/features/ZonedDateTimeTest.java +++ b/snack3_demo/src/test/java/features/ZonedDateTimeTest.java @@ -9,6 +9,7 @@ import org.noear.snack.from.ObjectFromer; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; /** * ZoneDateTime序列化测试 @@ -27,7 +28,7 @@ public class ZonedDateTimeTest { //解析 ZonedDateTimeModel model = oNode.toObject(ZonedDateTimeModel.class); ZonedDateTime date = model.date; - ZonedDateTime zonedDateTime = date.withZoneSameInstant(ZoneId.of("+03:00")); + ZonedDateTime zonedDateTime = date.withZoneSameInstant(ZoneId.of("GMT+3")); assert date.toInstant().equals(zonedDateTime.toInstant()); }