From 09bf38d0b020536695587dd789161f8e7bedca4f Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 21 Sep 2026 11:29:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(common):=20=E4=BF=AE=E5=A4=8D=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E6=97=B6=E9=97=B4=E6=88=B3=E8=A7=A3=E6=9E=90=E6=BA=A2?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/util/json/WxDateTypeAdapter.java | 7 ++- .../util/json/WxDateTypeAdapterTest.java | 47 +++++++++++++++++++ .../src/test/resources/testng.xml | 1 + 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 weixin-java-common/src/test/java/me/chanjar/weixin/common/util/json/WxDateTypeAdapterTest.java diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxDateTypeAdapter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxDateTypeAdapter.java index fd54cf3f43..0dbad926c6 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxDateTypeAdapter.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxDateTypeAdapter.java @@ -35,7 +35,12 @@ public Date read(JsonReader in) throws IOException { in.nextNull(); return null; case NUMBER: - return new Date(in.nextInt() * 1000); + long seconds = in.nextLong(); + try { + return new Date(Math.multiplyExact(seconds, 1000L)); + } catch (ArithmeticException e) { + throw new JsonParseException("Timestamp seconds out of range: " + seconds, e); + } default: throw new JsonParseException("Expected NUMBER but was " + peek); } diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/json/WxDateTypeAdapterTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/json/WxDateTypeAdapterTest.java new file mode 100644 index 0000000000..66395b6b51 --- /dev/null +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/json/WxDateTypeAdapterTest.java @@ -0,0 +1,47 @@ +package me.chanjar.weixin.common.util.json; + +import com.google.gson.JsonParseException; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.util.Date; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +/** + * Tests for {@link WxDateTypeAdapter}. + */ +public class WxDateTypeAdapterTest { + private final WxDateTypeAdapter adapter = new WxDateTypeAdapter(); + + @Test + public void testReadTimestampAfter2038() throws IOException { + Date date = this.adapter.fromJson("4102444800"); + + assertThat(date).isEqualTo(new Date(4102444800000L)); + } + + @Test + public void testReadRejectsPositiveMillisecondOverflow() { + long overflowingSeconds = Long.MAX_VALUE / 1000 + 1; + + assertThatThrownBy(() -> this.adapter.fromJson(Long.toString(overflowingSeconds))) + .isInstanceOf(JsonParseException.class) + .hasMessageContaining("out of range"); + } + + @Test + public void testReadRejectsNegativeMillisecondOverflow() { + long overflowingSeconds = Long.MIN_VALUE / 1000 - 1; + + assertThatThrownBy(() -> this.adapter.fromJson(Long.toString(overflowingSeconds))) + .isInstanceOf(JsonParseException.class) + .hasMessageContaining("out of range"); + } + + @Test + public void testWriteUsesSeconds() throws IOException { + assertThat(this.adapter.toJson(new Date(4102444800123L))).isEqualTo("4102444800"); + } +} diff --git a/weixin-java-common/src/test/resources/testng.xml b/weixin-java-common/src/test/resources/testng.xml index a5c082f03b..a113513081 100644 --- a/weixin-java-common/src/test/resources/testng.xml +++ b/weixin-java-common/src/test/resources/testng.xml @@ -7,6 +7,7 @@ +