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 楼答案
.appendLiteral('Z')
意味着你期望字母“Z”在这里,而不是其他使用
appendTimeZoneOffset(String zeroOffsetText, boolean showSeparators, int minFields, int maxFields)
代替时区偏移例如:
.appendTimeZoneOffset("Z", true, 2, 2)
表示时区偏移,以小时和分钟表示,或“Z”表示“Zulu”(UTC)