Java JSONB申请日期减去一天

Java JSONB申请日期减去一天,java,json,jsonb-api,Java,Json,Jsonb Api,我正在尝试用JSON中的日期序列化一个简单对象。 为此,我使用JavaEE中的JSONB库。 我宁愿使用日期对象而不是简单的字符串,因为我希望数据是强类型的 不幸的是,当我序列化对象JSON格式时,它似乎应用了日期的负一天,就好像它使用了另一个语言环境或时区 这是我的第一次尝试,使用默认区域设置: import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import j

我正在尝试用JSON中的日期序列化一个简单对象。 为此,我使用JavaEE中的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”}

然后,我对我们的语言环境做了第二个版本:

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


您能帮忙吗?

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

newsimpledateformat(“yyyy-MM-dd-ZZZZZ”).parse(“2021-03-19+0000”);
您将获得
2021-03-19
。但是,我不会使用
java.util.Date
来存储没有时间或时区的日期。最好使用更适合您需要的
java.time.LocalDate
。因此:

公共类MyDate{
私有LocalDate myDate;
//Getter+setter
公共静态void main(字符串[]args){
MyDate MyDate=新的MyDate();
myDate.setMyDate(LocalDate.of(2012,3,19));
System.out.println(JsonbBuilder.create().toJson(myDate));
}
}
另见:


尝试将时区添加到您的日期中我明白了这个想法,但我不知道它在我的代码中的位置