使用新的Java 8 DateTimeFormatter进行严格的日期解析

0xbe5077ed

我有一个简单的问题:我想"yyyyMMdd"严格解析Java字符串的格式,所以这"19800229"是有效日期,但"19820229"不是。假设这些是公历的公历。

我正在尝试使用java.timeJDK 8中的新软件包来解决此问题,但是事实证明,它比希望的要复杂。我当前的代码是:

private static final DateTimeFormatter FORMAT = DateTimeFormatter
        .ofPattern("yyyyMMdd").withChronology(IsoChronology.INSTANCE)
        .withResolverStyle(STRICT);

public static LocalDate parse(String yyyyMMdd) {
    return LocalDate.parse(yyyyMMdd, FORMAT);
}

但是,解析一个有效的日期(例如“ 19800228”)对我来说是一个无法理解的错误:

java.time.format.DateTimeParseException:无法解析文本“ 19820228”:无法从TemporalAccessor获取LocalDate:{MonthOfYear = 2,DayOfMonth = 28,YearOfEra = 1982},类型为java.time.format.Parsed的ISO

如何使用它java.time.format.DateTimeFormatter来解决我的简单用例?

技术旅行

我正在通过使用DateTimeFormatterBuilder创建的自定义格式化程序来限制哪种字符串被认为有效。

public class DateFormmaterTest {

    static DateTimeFormatter CUSTOM_BASIC_ISO_DATE = new DateTimeFormatterBuilder()
            .parseCaseInsensitive().appendValue(YEAR, 4)
            .appendValue(MONTH_OF_YEAR, 2).appendValue(DAY_OF_MONTH, 2)
            .optionalStart().toFormatter()
            .withResolverStyle(ResolverStyle.STRICT)
            .withChronology(IsoChronology.INSTANCE);

    public static void main(String[] args) {

        LocalDate date1 = LocalDate.parse("19800228-5000",
                CUSTOM_BASIC_ISO_DATE);

        System.out.println(date1);

    }
}

1982年2月29日无效,将引发以下情况:

Caused by: java.time.DateTimeException: Invalid date 'February 29' as '1982' is not a leap year
    at java.time.LocalDate.create(LocalDate.java:429)

日期为19800228-5000的日期可以与BASIC_ISO_DATE一起使用,因为它允许您不希望使用的可选偏移量。我的CUSTOM_BASIC_ISO_DATE格式化程序将不允许这样做,并抛出以下内容:

Exception in thread "main" java.time.format.DateTimeParseException: Text '19800228-5000' could not be parsed, unparsed text found at index 8. 

注意,如果您确定字符串长度yyyyMMdd,则可以始终使用前8个字符的子字符串来消除对解析器的需求。但是那是两件事。解析程序将在输入中标记无效的日期格式,并且子字符串当然会删除多余的字符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用新的java.time.DateTimeFormatter解析日期和时间

来自分类Dev

Java的8 DateTimeFormatter解析可选节

来自分类Dev

Java8 DateTimeFormatter解析带有一位和两位数日期的日期

来自分类Dev

使用DateTimeFormatter解析AM / PM时间时,Java 8 DateTimeParseException

来自分类Dev

使用DateTimeFormatter ofPattern解析日期

来自分类Dev

使用DateTimeFormatter解析没有月份的日期

来自分类Dev

使用 Java8 LocalDateTime Iso 日期格式解析错误

来自分类Dev

Java 8 DateTimeFormatter解析具有不同重要性的可选小数秒

来自分类Dev

为什么我的pattern(“ yyyyMM”)无法用DateTimeFormatter(java 8)解析

来自分类Dev

DateTimeFormatter无法解析最新与十进制0秒的java 8后

来自分类Dev

Java 8:使用流转换日期

来自分类Dev

使用Java 8解析LocalDateTime的问题

来自分类Dev

Java 8-使用BiPredicate进行过滤

来自分类Dev

使用Java 8 Streams进行类的学习

来自分类Dev

Java 8:如何解析借记卡的到期日期?

来自分类Dev

Java 8 LocalDateTime ZonedDateTime无法解析带时区的日期

来自分类Dev

泽西岛解析Java 8日期时间

来自分类Dev

按时间间隔对Java 8日期进行分组

来自分类Dev

Java8 DateTimeFormatter上午/下午

来自分类Dev

使用Moshi和R8进行枚举解析失败

来自分类Dev

使用Java 8新API的CollectionUtills的编译错误

来自分类Dev

使用Java 8 java.time。*进行时态计算

来自分类Dev

使用流Java 8在List Java中进行修改

来自分类Dev

使用Maven和Java 8使用Lombok进行编译

来自分类Dev

使用AngularJS进行日期解析/转换

来自分类Dev

Java8解析给定字符串的日期或日期时间格式

来自分类Dev

在不使用静态对象的情况下严格解析 groovy 中的日期时间

来自分类Dev

尝试使用joda DateTimeFormatter解析日期时间时发生运行时异常

来自分类Dev

Java 8日期时间:从ZonedDateTime开始新的一天

Related 相关文章

  1. 1

    使用新的java.time.DateTimeFormatter解析日期和时间

  2. 2

    Java的8 DateTimeFormatter解析可选节

  3. 3

    Java8 DateTimeFormatter解析带有一位和两位数日期的日期

  4. 4

    使用DateTimeFormatter解析AM / PM时间时,Java 8 DateTimeParseException

  5. 5

    使用DateTimeFormatter ofPattern解析日期

  6. 6

    使用DateTimeFormatter解析没有月份的日期

  7. 7

    使用 Java8 LocalDateTime Iso 日期格式解析错误

  8. 8

    Java 8 DateTimeFormatter解析具有不同重要性的可选小数秒

  9. 9

    为什么我的pattern(“ yyyyMM”)无法用DateTimeFormatter(java 8)解析

  10. 10

    DateTimeFormatter无法解析最新与十进制0秒的java 8后

  11. 11

    Java 8:使用流转换日期

  12. 12

    使用Java 8解析LocalDateTime的问题

  13. 13

    Java 8-使用BiPredicate进行过滤

  14. 14

    使用Java 8 Streams进行类的学习

  15. 15

    Java 8:如何解析借记卡的到期日期?

  16. 16

    Java 8 LocalDateTime ZonedDateTime无法解析带时区的日期

  17. 17

    泽西岛解析Java 8日期时间

  18. 18

    按时间间隔对Java 8日期进行分组

  19. 19

    Java8 DateTimeFormatter上午/下午

  20. 20

    使用Moshi和R8进行枚举解析失败

  21. 21

    使用Java 8新API的CollectionUtills的编译错误

  22. 22

    使用Java 8 java.time。*进行时态计算

  23. 23

    使用流Java 8在List Java中进行修改

  24. 24

    使用Maven和Java 8使用Lombok进行编译

  25. 25

    使用AngularJS进行日期解析/转换

  26. 26

    Java8解析给定字符串的日期或日期时间格式

  27. 27

    在不使用静态对象的情况下严格解析 groovy 中的日期时间

  28. 28

    尝试使用joda DateTimeFormatter解析日期时间时发生运行时异常

  29. 29

    Java 8日期时间:从ZonedDateTime开始新的一天

热门标签

归档