JSONB 适用日期减去一天
JSONB applies minus one day on date
我正在尝试序列化一个日期在 JSON 中的简单对象。
为此,我使用了来自 Java EE 的 JSONB 库。
我宁愿使用日期对象而不是简单的字符串,因为我希望数据是强类型的。
不幸的是,当我序列化对象 JSON 格式时,它似乎在日期上应用减去一天,就好像它正在使用另一个语言环境或时区一样。
这是我的第一次尝试,使用默认语言环境:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.json.bind.JsonbBuilder;
import javax.json.bind.annotation.JsonbDateFormat;
public class MyDate {
@JsonbDateFormat("yyyy-MM-dd")
private Date myDate;
// Getter + setter
public static void main(String[] args) throws ParseException {
MyDate myDate = new MyDate();
myDate.setMyDate(new SimpleDateFormat("yyyy-MM-dd").parse("2021-03-19"));
System.out.println(JsonbBuilder.create().toJson(myDate));
}
}
结果是:{"myDate":"2021-03-18"}
然后我用 en-US 语言环境做了第二个版本:
@JsonbDateFormat(value = "yyyy-MM-dd", locale = "en_US")
private Date myDate;
// Getter + setter
public static void main(String[] args) throws ParseException {
MyDate myDate = new MyDate();
myDate.setMyDate(new SimpleDateFormat("yyyy-MM-dd", Locale.US).parse("2021-03-19"));
System.out.println(JsonbBuilder.create().toJson(myDate));
}
结果:{"myDate":"2021-03-18"}
然后我尝试指定一个时间,它奏效了,但这不是解决方案:
@JsonbDateFormat(value = "yyyy-MM-dd", locale = "en_US")
private Date myDate;
// Getter + setter
public static void main(String[] args) throws ParseException {
MyDate myDate = new MyDate();
myDate.setMyDate(new SimpleDateFormat("yyyy-MM-dd HH:MM:SS", Locale.US).parse("2021-03-19 12:00:00"));
System.out.println(JsonbBuilder.create().toJson(myDate));
}
结果:{"myDate":"2020-12-19"}
你能帮忙吗?
您的问题是您在创建日期时忽略了时区。如果您使用时区信息创建日期,例如:
new SimpleDateFormat("yyyy-MM-dd ZZZZZ").parse("2021-03-19 +0000");
你会得到2021-03-19
。但是,我不会使用 java.util.Date
来存储没有时间或时区的日期。最好使用更符合您需求的 java.time.LocalDate
。所以:
public class MyDate {
private LocalDate myDate;
// Getter + setter
public static void main(String[] args) {
MyDate myDate = new MyDate();
myDate.setMyDate(LocalDate.of(2012, 3, 19));
System.out.println(JsonbBuilder.create().toJson(myDate));
}
}
另请参阅:
我正在尝试序列化一个日期在 JSON 中的简单对象。 为此,我使用了来自 Java EE 的 JSONB 库。 我宁愿使用日期对象而不是简单的字符串,因为我希望数据是强类型的。
不幸的是,当我序列化对象 JSON 格式时,它似乎在日期上应用减去一天,就好像它正在使用另一个语言环境或时区一样。
这是我的第一次尝试,使用默认语言环境:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.json.bind.JsonbBuilder;
import javax.json.bind.annotation.JsonbDateFormat;
public class MyDate {
@JsonbDateFormat("yyyy-MM-dd")
private Date myDate;
// Getter + setter
public static void main(String[] args) throws ParseException {
MyDate myDate = new MyDate();
myDate.setMyDate(new SimpleDateFormat("yyyy-MM-dd").parse("2021-03-19"));
System.out.println(JsonbBuilder.create().toJson(myDate));
}
}
结果是:{"myDate":"2021-03-18"}
然后我用 en-US 语言环境做了第二个版本:
@JsonbDateFormat(value = "yyyy-MM-dd", locale = "en_US")
private Date myDate;
// Getter + setter
public static void main(String[] args) throws ParseException {
MyDate myDate = new MyDate();
myDate.setMyDate(new SimpleDateFormat("yyyy-MM-dd", Locale.US).parse("2021-03-19"));
System.out.println(JsonbBuilder.create().toJson(myDate));
}
结果:{"myDate":"2021-03-18"}
然后我尝试指定一个时间,它奏效了,但这不是解决方案:
@JsonbDateFormat(value = "yyyy-MM-dd", locale = "en_US")
private Date myDate;
// Getter + setter
public static void main(String[] args) throws ParseException {
MyDate myDate = new MyDate();
myDate.setMyDate(new SimpleDateFormat("yyyy-MM-dd HH:MM:SS", Locale.US).parse("2021-03-19 12:00:00"));
System.out.println(JsonbBuilder.create().toJson(myDate));
}
结果:{"myDate":"2020-12-19"}
你能帮忙吗?
您的问题是您在创建日期时忽略了时区。如果您使用时区信息创建日期,例如:
new SimpleDateFormat("yyyy-MM-dd ZZZZZ").parse("2021-03-19 +0000");
你会得到2021-03-19
。但是,我不会使用 java.util.Date
来存储没有时间或时区的日期。最好使用更符合您需求的 java.time.LocalDate
。所以:
public class MyDate {
private LocalDate myDate;
// Getter + setter
public static void main(String[] args) {
MyDate myDate = new MyDate();
myDate.setMyDate(LocalDate.of(2012, 3, 19));
System.out.println(JsonbBuilder.create().toJson(myDate));
}
}
另请参阅: