1

我正在尝试用 JSON 中的日期序列化一个简单的对象。为此,我使用 Java EE 的 JSONB 库。我宁愿使用 Date 对象而不是简单的 String,因为我希望数据是强类型的。

不幸的是,当我序列化对象 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"}

然后我用美国语言环境做了第二个版本:

    @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"}

你能帮忙吗?

4

1 回答 1

1

您的问题是您在创建日期时忽略了时区。如果您使用时区信息创建日期,例如:

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));
    }

}

也可以看看:

于 2021-03-20T11:33:01.123 回答