DateTimeFormatter模式有问题

我正在编写一个股票程序(到目前为止)通过以下请求从“Markit on Demand”获取数据:

http://dev.markitondemand.com/Api/v2/Quote/xml?symbol=aapl

这将返回xml中的数据,其中包含各种库存度量(符号,名称,最后价格,更改,时间戳等)。

我在Java 8中创建DateTimeFormatter以制作时间戳时遇到问题。

时间戳的一个示例:

Fri Jul 18 15:59:00 UTC-04:00 2014

到目前为止,我的模式如下:

EEE MMM d HH:mm:ss OOOO yyyy

我相信你们中的一些人可以发现,我在抵消方面遇到了麻烦。

来自文档:

偏移X和x:根据模式字母的数量格式化偏移。 一个字母仅输出小时,例如’+01’,除非分钟非零,在这种情况下分钟也输出,例如’+0130’。 两个字母输出小时和分钟,没有冒号,例如’+0130’。 三个字母输出小时和分钟,带有冒号,例如’+01:30’。 四个字母输出小时和分钟以及可选秒,没有冒号,例如’+013015’。 五个字母输出小时和分钟,可选秒输出冒号,例如’+01:30:15’。 六个或更多字母抛出IllegalArgumentException。 当要输出的偏移量为零时,模式字母“X”(大写)将输出“Z”,而模式字母“x”(小写)将输出“+00”,“+ 0000”或“+00” :00′ 。

偏移O:根据模式字母的数量格式化局部偏移。 一个字母输出局部偏移的缩写forms,即局部偏移文本,例如’GMT’,小时不带前导零,可选2位数分钟,第二个非零,和冒号,例如’GMT + 8 ”。 四个字母输出完整forms,这是本地化的偏移文本,例如’GMT,具有2位小时和分钟字段,可选的第二字段(如果非零)和冒号,例如’GMT + 08:00’。 任何其他字母数量都会抛出IllegalArgumentException。

偏移Z:根据模式字母的数量格式化偏移。 一个,两个或三个字母输出小时和分钟,没有冒号,例如’+0130’。 当偏移量为零时,输出将为“+0000”。 四个字母输出完整forms的局部偏移,相当于Offset-O的四个字母。 如果偏移为零,则输出将是相应的本地化偏移文本。 五个字母输出小时,分钟,可选第二个,如果非零,则使用冒号。 如果偏移量为零,则输出“Z”。 六个或更多字母抛出IllegalArgumentException。

 // String rawDate = Fri Jul 18 15:59:00 UTC-04:00 2014 DateTimeFormatter PARSER_PATTERN = DateTimeFormatter.ofPattern("EEE MMM d HH:mm:ss 'UTC'XXX yyyy"); ZonedDateTime timeStamp = ZonedDateTime.parse(rawDate, PARSER_PATTERN); 

这是有效的,但我很好奇为什么(代替’UTC’XXX) OOOO不起作用。

我决定使用字符串’UTC’,因为时间戳总是以“UTC + 00:00”的forms给出。

我想出的最终模式是为了匹配分区日期时间:

Fri Jul 18 15:59:00 UTC-04:00 2014

EEE MMM d HH:mm:ss 'UTC'XXX yyyy