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

2024-02-01

我需要创建一个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";

我尝试过以下日期时间格式化程序,但最后两个日期失败(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();

所有日期从date1 to date8工作正常,但我得到了DateTimeParseException当尝试解析最后两个日期时:

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

为了解析我正在使用的日期。

LocalDateTime.parse(date1, DATE_TIME_FORMATTER);

偏移量的有效模式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

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


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

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();

这将解析所有 10 个示例日期时间字符串。

我不太确定它为什么有效。我想它现在正在尝试+HHmm before +HH,这确保当有四个数字时它会得到所有四位数字,而不是保留最后两位未解析。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在一个 DateTimeFormatter Java 8 中处理所有区域偏移 的相关文章

随机推荐