有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

目前,我正在使用以下日期解析器来解析作为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"));
}

它正确解析前四个案例,但最后一个案例失败,错误如下:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "2016-01-15T16:58:57.649-05:00" is malformed at "-05:00"

当我在格式中添加文字Z时,我理解了它的失败。但我希望它能像时区解析器一样工作

对于上述所有格式,有没有简单的方法可以使用带有可选参数的同一解析器?或者我需要根据我得到的字符串使用不同的格式吗


共 (1) 个答案

  1. # 1 楼答案

    .appendLiteral('Z')意味着你期望字母“Z”在这里,而不是其他

    使用appendTimeZoneOffset(String zeroOffsetText, boolean showSeparators, int minFields, int maxFields)代替时区偏移

    例如: .appendTimeZoneOffset("Z", true, 2, 2)表示时区偏移,以小时和分钟表示,或“Z”表示“Zulu”(UTC)