Java DateTimeFormatter模式出现问题

Java DateTimeFormatter模式出现问题,java,java-8,datetimeoffset,java-time,Java,Java 8,Datetimeoffset,Java Time,我正在编写一个股票程序,该程序(到目前为止)通过如下请求从“Markit on Demand”获取数据: 这将返回xml格式的数据,以及股票的各种度量(符号、名称、最新价格、变化、时间戳等) 我在Java8中创建DateTimeFormatter以生成时间戳时遇到问题 时间戳的一个示例: 2014年7月18日星期五15:59:00 UTC-04:00 到目前为止,我的模式如下: EEE MMM d HH:mm:ss ooo yyyy 我相信你们中的一些人可以发现,我在偏移量方面遇到了问题 从文

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

这将返回xml格式的数据,以及股票的各种度量(符号、名称、最新价格、变化、时间戳等)

我在Java8中创建DateTimeFormatter以生成时间戳时遇到问题

时间戳的一个示例:

2014年7月18日星期五15:59:00 UTC-04:00

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

EEE MMM d HH:mm:ss ooo yyyy

我相信你们中的一些人可以发现,我在偏移量方面遇到了问题

从文件中:

偏移量X和X:根据图案字母的数量设置偏移量的格式。一个字母仅输出小时,如“+01”,除非分钟为非零,在这种情况下,也输出分钟,如“+0130”。两个字母输出小时和分钟,不带冒号,如“+0130”。三个字母输出小时和分钟,带有冒号,如“+01:30”。四个字母输出小时、分钟和可选秒,不带冒号,如“+013015”。五个字母输出小时、分钟和可选秒,并带有冒号,如“+01:30:15”。六个或六个以上的字母会引发IllegalArgumentException。当要输出的偏移量为零时,图案字母“X”(大写)将输出“Z”,而图案字母“X”(小写)将输出“+00”、““+0000”或“+00:00”

偏移量O:根据图案字母的数量设置本地化偏移量的格式。一个字母输出本地化偏移量的缩写形式,即本地化偏移量文本,例如“GMT”,其中小时不带前导零,如果非零,可选两位数分钟和秒,以及冒号,例如“GMT+8”。四个字母输出完整形式,这是本地化的偏移文本,例如“GMT,带有两位数的小时和分钟字段,如果非零,则可选第二个字段,以及冒号,例如“GMT+08:00”。任何其他字母计数都会引发IllegalArgumentException

偏移量Z:根据图案字母的数量设置偏移量的格式。一个、两个或三个字母输出小时和分钟,不带冒号,例如“+0130”。当偏移量为零时,输出将为“+0000”。四个字母输出完整形式的本地化偏移量,相当于四个字母的偏移量-O。如果偏移量为零,则输出将是相应的本地化偏移量文本。五个字母输出小时、分钟,如果非零,可选择秒,带冒号。如果偏移量为零,则输出“Z”。六个或六个以上的字母会引发IllegalArgumentException


这是可行的,但我很好奇为什么(代替'UTC'XXX)
ooo
不起作用。

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

我想出的最后一个模式与分区日期时间相匹配:

2014年7月18日星期五15:59:00 UTC-04:00


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

似乎合理,但这将匹配一个
OffsetDateTime
,而不是一个
ZonedDateTime
。然而,它并没有真正回答您最初的问题,即为什么
ooo
不起作用。根据文件,应该是这样的。就在这一部分的上方,它显示了一个
UTC-08:00
的示例。这就是为什么我有点困惑的原因……我回答了关于它应该是什么的最初问题,但不是为什么
OOOO
不起作用。也许如果您编辑原始问题以删除有关股票程序的部分,然后只显示使用带有此特定输入字符串的
DateTimeFormatter
的Java代码,那么比我更熟悉的人可以回答关于
ooo
不起作用的问题。但是找到解决方法做得很好。Java8解析格式模式OOOO时会有错误吗?当试图解析字符串时,我得到一个
StringIndexOutOfBoundsException
,其中偏移量在字符串末尾给出为
GMT+02:00
。在Java9中,同样的解析工作得很顺利,这就是为什么我怀疑Java8.From中有一个bug。DateTimeFormatter无法为包含“O”的格式字符串解析自己的输出。在我的Java 9中,它可以与
GMT-04:00
一起工作,但我仍然无法使它与
UTC-04:00
一起工作。不知道为什么。
// 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);