加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 06:00:27 所属栏目:Java 来源:网络整理
导读:我有一个简单的问题:我想严格地解析格式为“yyyyMMdd”的 Java字符串,所以“19800229”是一个有效的日期,但“19820229”不是.假设这些是正常公历的日期. 我正在尝试使用JDK 8中的新的java.time包来解决这个问题,但它比希望更复杂.我当前的代码是: private
我有一个简单的问题:我想严格地解析格式为“yyyyMMdd”的 Java字符串,所以“19800229”是一个有效的日期,但“19820229”不是.假设这些是正常公历的日期.

我正在尝试使用JDK 8中的新的java.time包来解决这个问题,但它比希望更复杂.我当前的代码是:

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: Text ‘19820228’ could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {MonthOfYear=2,DayOfMonth=28,YearOfEra=1982},ISO of type java.time.format.Parsed

如何使用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);

    }
}

2/29/1982是无效的,并将抛出以下内容:

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个字符的子字符串来否定解析器的需要.不过这是两件事情.解析器将在输入时标记无效的日期格式,子串当然只会剥离额外的字符.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读