SimpleDateFormat无法正确格式化偏移日期时间

时间:2019-10-22 02:00:18

标签: java datetime simpledateformat datetime-format timezone-offset

我的时间戳如下,2019-10-17T07:10:3​​9.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:3​​9.021 + 10:30

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

应该与输入相同。

2 个答案:

答案 0 :(得分:2)

您拥有2019-10-17T07:10:39.021+10:30的日期字符串由offset组成,因此从java-8开始,您可以使用OffsetDateTime

  

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

OffsetDateTime dateTime = OffsetDateTime.parse(date);

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

答案 1 :(得分:0)

为什么要使用Locale.getDefault(),所以不需要该参数。您可以尝试按如下方式调用它吗?

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