如何在一个DateTimeFormater Java 8中处理所有区域偏移

Ami*_*arg 3 datetime-parsing java-8 java-time zoneddatetime

我需要DateTimeFormatter为以下有效日期创建一个.

  String date1 = "2017-06-20T17:25:28";
  String date2 = "2017-06-20T17:25:28.477777";
  String date3 = "2017-06-20T17:25:28.477777Z";
  String date4 = "2017-06-20T17:25:28.477777UTC";
  String date5 = "2017-06-20T17:25:28.477777-05";
  String date6 = "2017-06-20T17:25:28.477777+05";
  String date7 = "2017-06-20T17:25:28.477777+05:30";
  String date8 = "2017-06-20T17:25:28.477777-05:30";
  String date9 = "2017-06-20T17:25:28.477777+0530";
  String date10 = "2017-06-20T17:25:28.477777-0530";
Run Code Online (Sandbox Code Playgroud)

我已经尝试了以下日期时间格式化程序,但最后两个日期(date9,date10)失败.

private static final DateTimeFormatter DATE_TIME_FORMATTER = new DateTimeFormatterBuilder()
    .appendPattern("yyyy-MM-dd'T'HH:mm:ss")
    .appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)
                        .optionalStart().appendZoneId().optionalEnd()
                        .optionalStart().appendOffset("+HH", "+00").optionalEnd()
                        .optionalStart().appendOffset("+HH:mm", "+00:00").optionalEnd()
                        .optionalStart().appendOffset("+HHmm", "+0000").optionalEnd().toFormatter();
Run Code Online (Sandbox Code Playgroud)

所有日期都date1可以date8正常工作,但我DateTimeParseException在尝试解析最后两个日期时得到了一个:

线程"main"java.time.format.DateTimeParseException中的异常:无法解析文本"2017-06-20T17:25:28.477777 + 0530",在索引29处找到未解析的文本

用于解析我正在使用的日期.

LocalDateTime.parse(date1, DATE_TIME_FORMATTER);
Run Code Online (Sandbox Code Playgroud)

偏移的有效模式来自OffsetIdPrinterParser:

static final class OffsetIdPrinterParser implements DateTimePrinterParser {
        static final String[] PATTERNS = new String[] {
            "+HH", "+HHmm", "+HH:mm", "+HHMM", "+HH:MM", "+HHMMss", "+HH:MM:ss", "+HHMMSS", "+HH:MM:SS",
        };  // order used in pattern builder
Run Code Online (Sandbox Code Playgroud)

当我使用有效的ZoneOffset模式时,我无法理解,为什么我的最后两个日期失败.

Ole*_*.V. 5

只需颠倒可选部分的顺序:

private static final DateTimeFormatter DATE_TIME_FORMATTER = new DateTimeFormatterBuilder()
        .appendPattern("yyyy-MM-dd'T'HH:mm:ss")
        .appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)
        .optionalStart().appendZoneId().optionalEnd()
        .optionalStart().appendOffset("+HHmm", "+0000").optionalEnd()
        .optionalStart().appendOffset("+HH:mm", "+00:00").optionalEnd()
        .optionalStart().appendOffset("+HH", "+00").optionalEnd()
        .toFormatter();
Run Code Online (Sandbox Code Playgroud)

这将解析所有10个样本日期时间字符串.

我不太清楚为什么会这样.我想,现在正试图+HHmm之前+HH,这确保它得到全部四个数字的时候有四个,而不是让最后两个未解析.