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

标签 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"));
}

它正确解析前四种情况,但最后一种情况失败,并出现以下错误:

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

当我将文字 Z 附加到格式中时,我理解了它的失败。但我希望它能作为时区解析器工作!

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

最佳答案

.appendLiteral('Z') 表示您期望此处为字母“Z”,仅此而已。

使用 appendTimeZoneOffset(String ZeroOffsetText, boolean showSeparators, int minFields, int maxFields) 代替预期时区偏移量。

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

关于Java:将日期解析为可能包含也可能不包含时区信息的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34854981/

相关文章:

java - Java 中的日期问题

java - 在 App 层之间传递 Joda Time 对象

java - 通过 wildfly maven 插件重启 jboss 的命令行参数是什么?

Java:数组索引越界

java - Android 无法解析的日期(在偏移量 0 处)

java - JodaTime:如何获取 DateTimeZone 的人类可读名称

java - Joda Time 将包含在 Java 7 中?

java - 如何列出所有 JPMS 服务?

java - 使用 Date 类将给定日期的字符串与当前日期进行比较时出现 Null 对象引用异常

java - 从oracle获取后java中的不同日期格式