【发布时间】:2014-07-20 15:01:02
【问题描述】:
我正在编写一个股票程序,它(到目前为止)通过如下请求从“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'。
Offset O:这会根据模式字母的数量来格式化本地化的偏移量。一个字母输出本地化偏移量的简写形式,即本地化偏移量文本,例如“GMT”,小时不带前导零,如果非零,则可选两位数分钟和秒,以及冒号,例如“GMT+8” '。四个字母输出完整形式,即本地化偏移文本,例如“GMT”,带有 2 位小时和分钟字段,如果非零,则可选第二个字段和冒号,例如“GMT+08:00”。任何其他字母计数都会引发 IllegalArgumentException。
偏移 Z:这会根据图案字母的数量来格式化偏移。一个、两个或三个字母输出小时和分钟,不带冒号,例如'+0130'。当偏移量为零时,输出将为“+0000”。四个字母输出本地化偏移的完整形式,相当于四个字母的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 不起作用。
【问题讨论】:
-
Java 8 解析格式模式 OOOO 时会不会有 bug?我在尝试解析字符串末尾的偏移量为
GMT+02:00的字符串时得到StringIndexOutOfBoundsException。在 Java 9 中,同样的解析工作很顺利,这就是我怀疑 Java 8 中存在错误的原因。 -
来自the bug database: java.time.format.DateTimeFormatter can't parse localized zone-offset。 “DateTimeFormatter 无法解析自己的输出以查找包含“O”的格式字符串。”
-
在我的 Java 9 中,它适用于
GMT-04:00,但我仍然无法使其适用于UTC-04:00。不知道为什么。
标签: java java-8 java-time datetimeoffset datetimeformatter