Java SimpleDateFormat未正确格式化偏移日期时间

Java SimpleDateFormat未正确格式化偏移日期时间,java,datetime,simpledateformat,datetime-format,timezone-offset,Java,Datetime,Simpledateformat,Datetime Format,Timezone Offset,我得到的时间戳如下,2019-10-17T07:10:39.021+10:30,但当我解析SimpleDateFormat然后再次打印时,它显示为2019-10-17T07:40:39.021+11:00 看起来它增加了30分钟的时间,然后改变了时区。有没有办法解决这个问题 Date date = null; String value = "2019-10-17T07:10:39.021+10:30"; SimpleDateForma

我得到的时间戳如下,2019-10-17T07:10:39.021+10:30,但当我解析SimpleDateFormat然后再次打印时,它显示为2019-10-17T07:40:39.021+11:00

看起来它增加了30分钟的时间,然后改变了时区。有没有办法解决这个问题

        Date date = null;       
        String value = "2019-10-17T07:10:39.021+10:30";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.getDefault());       
        System.out.println("input :" + value);
        try {
            date = sdf.parse(value);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("output :" + sdf.format(date));
结果

输入:2019-10-17T07:10:39.021+10:30

输出:2019-10-17T07:40:39.021+11:00


应该与输入相同。

为什么要使用
Locale.getDefault()
,该参数不是必需的。你能试着用下面的方式称呼它吗

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");

您拥有的日期字符串由组成,因此在java-8中可以使用

在ISO-8601日历系统(如2007-12-03T10:15:30+01:00)中,从UTC/格林威治偏移的日期时间


虽然您正确地认为
Locale.getDefault()
不是必需的,但删除它无助于解决这种情况。我建议您不要使用
SimpleDateFormat
Date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。只需使用
OffsetDateTime
from即可。
OffsetDateTime dateTime = OffsetDateTime.parse(date);

System.out.println(dateTime.toString());   //2019-10-17T07:10:39.021+10:30