Java:将日期解析为字符串,可能包含也可能不包含时区信息

时间:2016-01-18 12:37:18

标签: java date jodatime

目前我使用以下日期解析器来解析以String传递的日期:

public static final DateTimeParser FRACTION_PARSER = new DateTimeFormatterBuilder()
.appendLiteral('.').appendFractionOfSecond(0, 3).toParser();

public static final DateTimeFormatter DATE_FORMATTER = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd'T'HH:mm:ss")
.appendOptional(FRACTION_PARSER).appendLiteral('Z')
.toFormatter();

我有以下条件要解析:

public static void main(String[] args) {
    System.out.println(DATE_FORMATTER.parseDateTime("2016-01-13T13:38:19.679Z"));
    System.out.println(DATE_FORMATTER.parseDateTime("2016-01-13T13:38:19.67Z"));
    System.out.println(DATE_FORMATTER.parseDateTime("2016-01-13T13:38:19.6Z"));
    System.out.println(DATE_FORMATTER.parseDateTime("2016-01-13T13:38:19Z"));
    System.out.println(DATE_FORMATTER.parseDateTime("2016-01-15T16:58:57.649-05:00"));
}

它正确地解析了前四个案例但是对于最后一个案例失败了以下错误:

  

线程中的异常" main" java.lang.IllegalArgumentException:格式无效:" 2016-01-15T16:58:57.649-05:00"在" -05:00"

时格式不正确

我理解它的失败,因为我将文字Z附加到格式中。但是我期待它能够作为timeZone解析器工作!

对于所有上述格式,是否有任何简单的方法可以使用带有可选参数的相同解析器?或者我需要使用不同的格式,具体取决于我得到的字符串?

1 个答案:

答案 0 :(得分:2)

.appendLiteral('Z')表示您希望字母“Z'在这里,没有别的。

请改用appendTimeZoneOffset(String zeroOffsetText, boolean showSeparators, int minFields, int maxFields)来预期时区偏移。

例如: .appendTimeZoneOffset("Z", true, 2, 2)表示时区偏移,小时和分钟或“Z'为"祖鲁" (UTC)。