Skip to content

Commit

Permalink
bug fix for java.sql.Timestamp codec, fix alibaba#164
Browse files Browse the repository at this point in the history
  • Loading branch information
wenshao committed May 5, 2022
1 parent f518153 commit d559402
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 4 deletions.
31 changes: 27 additions & 4 deletions core/src/main/java/com/alibaba/fastjson2/util/JdbcSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,16 @@ public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type f
JSONWriter.Context ctx = jsonWriter.getContext();

Timestamp date = (Timestamp) object;
int nanos = date.getNanos();

if (nanos == 0) {
jsonWriter.writeInt64(date.getTime());
if (formatUnixTime || ctx.isDateFormatUnixTime()) {
long millis = date.getTime();
jsonWriter.writeInt64(millis / 1000L);
return;
}

if (formatMillis || ctx.isDateFormatMillis()) {
long millis = date.getTime();
jsonWriter.writeInt64(millis);
return;
}

Expand All @@ -202,6 +208,13 @@ public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type f
}

if (dateFormatter == null) {
int nanos = date.getNanos();

if (nanos == 0) {
jsonWriter.writeInt64(date.getTime());
return;
}

int year = zdt.getYear();
int month = zdt.getMonthValue();
int dayOfMonth = zdt.getDayOfMonth();
Expand Down Expand Up @@ -233,6 +246,11 @@ public TimestampReader(String format) {
public Object readJSONBObject(JSONReader jsonReader, long features) {
if (jsonReader.isInt()) {
long millis = jsonReader.readInt64Value();

if (formatUnixTime) {
millis *= 1000;
}

return new Timestamp(millis);
}

Expand All @@ -247,14 +265,19 @@ public Object readJSONBObject(JSONReader jsonReader, long features) {
public Object readObject(JSONReader jsonReader, long features) {
if (jsonReader.isInt()) {
long millis = jsonReader.readInt64Value();

if (formatUnixTime) {
millis *= 1000L;
}

return new java.sql.Timestamp(millis);
}

if (jsonReader.readIfNull()) {
return null;
}

if (format == null) {
if (format == null || formatISO8601 || formatMillis) {
LocalDateTime localDateTime = jsonReader.readLocalDateTime();
if (localDateTime != null) {
return java.sql.Timestamp.valueOf(localDateTime);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package com.alibaba.fastjson2.date;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.annotation.JSONField;
import org.junit.jupiter.api.Test;

import java.time.ZonedDateTime;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class SqlTimestampTest {
@Test
public void test() {
String str = "{\"birthday\":\"2022-05-03 15:26:05\"}";
Student student = JSON.parseObject(str, Student.class);
assertEquals(str, JSON.toJSONString(student));
}

public static class Student {
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
public java.sql.Timestamp birthday;
}

@Test
public void test1() {
String str = "{\"birthday\":\"2022-05-03T15:26:05\"}";
Student1 student = JSON.parseObject(str, Student1.class);
String str2 = JSON.toJSONString(student);
Student1 student1 = JSON.parseObject(str2, Student1.class);
assertEquals(student.birthday.getYear(), student1.birthday.getYear());
assertEquals(student.birthday.toInstant().toEpochMilli(), student1.birthday.toInstant().toEpochMilli());
}

@Test
public void test1_null() {
String str = "{\"birthday\":null}";
Student1 student = JSON.parseObject(str, Student1.class);
assertEquals(str, JSON.toJSONString(student, JSONWriter.Feature.WriteNulls));
}

public static class Student1 {
@JSONField(format = "iso8601")
public java.sql.Timestamp birthday;
}

@Test
public void test2() {
String str = "{\"birthday\":\"2022-05-03 15:26:05\"}";
Student2 student = JSON.parseObject(str, Student2.class);
assertEquals(str, JSON.toJSONString(student, "yyyy-MM-dd HH:mm:ss"));
}

public static class Student2 {
public java.sql.Timestamp birthday;
}


@Test
public void test3() {
long millis = System.currentTimeMillis();
String str = "{\"birthday\":" + millis + "}";
Student3 student = JSON.parseObject(str, Student3.class);
String str2 = JSON.toJSONString(student);
Student3 student1 = JSON.parseObject(str2, Student3.class);
assertEquals(student.birthday.toInstant().getEpochSecond(), student1.birthday.toInstant().getEpochSecond());
}

public static class Student3 {
@JSONField(format = "millis")
public java.sql.Timestamp birthday;
}

@Test
public void test4() {
long seconds = System.currentTimeMillis() / 1000;
String str = "{\"birthday\":" + seconds + "}";
Student4 student = JSON.parseObject(str, Student4.class);
String str2 = JSON.toJSONString(student);
Student4 student1 = JSON.parseObject(str2, Student4.class);
assertEquals(student.birthday.toInstant().getEpochSecond()
, student1.birthday.toInstant().getEpochSecond()
);
}

public static class Student4 {
@JSONField(format = "unixtime")
public java.sql.Timestamp birthday;
}
}

0 comments on commit d559402

Please sign in to comment.