时区偏移量+ AA:BB的SimpleDateFormat问题

问题描述

我当前正在使用以下SimpleDateFormat模式:
String DATE_TIME_FORMAT_PATTERN = "yyyy-MM-dd'T'HH:mm:ss,SSSXXX";

这很好,但是某些树莓派Java实现无法正确识别它:

timestamp 2020-01-21T09:41:45,434Z

在大多数情况下,这不是问题,但是对于某些树莓派PI而言,偏移量是错误的;我不要是否可以使用具有相同偏移格式(+/- HH:mm)的替代模式?我已经尝试过各种模式,但是似乎没有一种模式可以产生相同的输出

我还使用以下工具搜索了这种模式:https://javadevtools.com/simpledateformat,尽管毫无用处。

注意:此格式的示例输出1997-07-16T19:20:30,45+01:00,其偏移量为冒号。

解决方法

如果您使用的是java.time,尤其是两个类java.time.OffsetDateTime(此符号在JavaDoc中进行了说明)和java.time.format.DateTimeFormatter,则您或您的Raspberry Pi将能够正确地解析时间戳(格式很奇怪,使用逗号将秒与秒分开)。

以下示例解析您的timestamp并输出默认格式:

public static void main(String[] args) {
    String timestamp = "1997-07-16T19:20:30,45+01:00";
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss[,SSS]xxx");
    OffsetDateTime odt = OffsetDateTime.parse(timestamp,dtf);
    System.out.println(odt);
}

输出:

1997-07-16T19:20:30.450+01:00
,

我确认这不是Pi问题。我将本地时区切换为UTC并运行以下示例:

long current = System.currentTimeMillis(); 
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss,SSSXXX"); 
Date date = new Date(current);
String parsed = format.format(date);
System.out.println(parsed);
2020-08-31T15:05:27,872Z

Z出现在Windows 10上。我错过了ISO规范的那一部分。看来我必须解决这种情况下的测试:)。谢谢大家!