2015-06-08 51 views
9

我想解析:2014-05-02-10.45.05.993280-5:00其中-5:00是UTC的偏移量。在Java 8中使用java.time DateTimeFormatterjava.timeTimeTimeFormatter时区偏移模式

对于第一位,我有以下内容:yyyy-MM-dd-HH.mm.ss.SSSSSS但是,我无法弄清楚模式应该解析偏移量。

如果我有4位数字的偏移量(-05:00),我可以使用:yyyy-MM-dd-HH.mm.ss.SSSSSSxxx,但这不适用于3位数字。

任何想法?

+1

您正在使用哪个版本的Java? –

+0

@JonSkeet - 对不起,更新了原文。 – Cheetah

回答

9

使用大写字母X而不是x,因此XXX。不同之处在于,大X可以将输入字母“Z”识别为UTC-Offset +00:00,而小字母X不能。

建议图案:

yyyy-MM-dd-HH.mm.ss.SSSSSSXXX 

请也意识到以下JDK-bug的:

java.time.format.DateTimeFormatter无法解析单 位数小时的偏移

更新:

我现在已经在错误日志中测试了描述的解决方法。

String input = "2014-05-02-10.45.05.993280-5:00"; 
DateTimeFormatter f = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS").parseLenient().appendOffset("+HH:MM", "Z").toFormatter(); 
System.out.println(f.parse(input, ZonedDateTime::from)); 

但它抛出一个异常:线程 “main” java.time.format.DateTimeParseException

例外: 文本“2014-05-02-10.45.05.993280-5: 00'无法在索引26 上的java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947) 位于HelloWorld.main处的java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849) (你好,世界。java:16)

因此,从宽松的解析也没有帮助。 所以现在只有三个选项留给你:

  • 使用。解决方法由臭虫记者建议:[...]解决方法是单独解析日期/时间,使用手工编码解析器偏移并将LocalDateTime与手解析的偏移量相结合。不是一件容易的工作。

  • 试试你自己的专门的字符串预处理。如果你有一个固定的格式,那么你可以尝试在位置26插入零数字(如果总输入长度是一个数字太小)。

  • 或者你使用一个外部库,它可以做到这一点。我的库Time4J(v4.0)可以做到这一点,如果你愿意添加额外的依赖。看到这个代码:

String input = "2014-05-02-10.45.05.993280-5:00"; ZonalDateTime zdt = ZonalDateTime.parse( input, Moment.localFormatter("yyyy-MM-dd-HH.mm.ss.SSSSSSXXX", PatternType.CLDR)); System.out.println(zdt); // 2014-05-02T10:45:05,993280UTC-05:00 ZonedDateTime result = zdt.toTemporalAccessor();

更新:根据JDK-错误状态,该错误已修复了Java的9,但对于Java的8一个补丁包,似乎并没有被尽管如此。

+0

该模式不起作用......但链接到bug看起来像我的问题。我尝试了建设者的建议,但这似乎也没有工作。 – Cheetah

+0

@Cheetah你是对的。对不起,你遭受了这个错误。如果您可以使用任何替代解决方法,请参阅我的更新。 –

2

偏移量SimpleDateFormat标志是Z检查Java7Java8SimpleDateFormat API

然后,String

2014-05-02-10.45.05.993280-5:00 

解析器格式必须为:

yyyy-MM-dd-HH.mm.ss.SSSSSSZ 

UPDATE:为DateTimeFormatter偏移模式用于格式化和解析是:

O  localized zone-offset  offset-O   GMT+8; GMT+08:00; UTC-08:00; 
X  zone-offset 'Z' for zero offset-X   Z; -08; -0830; -08:30; -083015; -08:30:15; 
x  zone-offset     offset-x   +0000; -08; -0830; -08:30; -083015; -08:30:15; 
Z  zone-offset     offset-Z   +0000; -0800; -08:00; 

DateTimeFormatter您需要的图案是X

+0

我正在使用'DateTimeFormatter'并添加一个'Z'不会显示为工作 – Cheetah

+1

您链接到Java 7两次。 [Java 8 API在这里](http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html) – dcsohl