DateTimeFormatter模式有问题

时间:2014-07-20 15:01:02

标签: java java-8 datetimeoffset java-time

我正在编写一个股票程序(到目前为止)从" 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:根据模式字母的数量格式化本地化偏移。一个字母输出本地化偏移的缩写形式,即本地化的偏移文本,例如' GMT',小时不带前导零,可选2位数分钟,第二个非零,冒号,示例' GMT + 8'。四个字母输出完整形式,这是本地化的偏移文本,例如GMT,具有2位小时和分钟字段,可选的第二字段(如果非零)和冒号,例如' GMT + 08 :00&#39 ;.任何其他字母数都会抛出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无效。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

不要为时区使用固定文本:

不要为时区使用固定文本(例如 'UTC'),因为该方法可能无法用于其他语言环境。

您可以使用模式 E MMM d H:m:s VV u 解析日期时间字符串。

演示:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "Fri Jul 18 15:59:00 UTC-04:00 2014";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("E MMM d H:m:s VV u", Locale.ENGLISH);
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, dtf);
        System.out.println(zdt);
    }
}

输出:

2014-07-18T15:59-04:00[UTC-04:00]

ONLINE DEMO


Trail: Date Time 了解有关现代 Date-Time API 的更多信息。