当前位置: 首页 > 知识库问答 >
问题:

使用新的Java8DateTimeFormatter进行严格的数据解析

裴存
2023-03-14

我有一个简单的问题:我希望严格地以“YYYYMMDD”的格式解析Java字符串,以便“19800229”是有效日期,而“19820229”不是。假设这些是正常公历的广告日期。

我试图使用JDK8中新的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);
}

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

共有1个答案

谯德元
2023-03-14

我正在进行编辑,以便通过使用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个字符的子字符串来消除对解析器的需求。然而,这是两回事。解析器将在输入上标记无效的日期格式,子字符串当然只会去掉额外的字符。

 类似资料:
  • 问题内容: 假设我正在使用Google的Gson库将JSON解析为Java数据结构。 如果Java字段没有对应的JSON,是否有一种简单的引发异常的方法?也就是说,我希望要求JSON具有Java结构中的所有字段。 问题答案: Gson没有JSON模式验证功能来指定必须存在一个特定的元素,也没有办法指定必须填充Java成员。拥有这样的功能(例如带有注释)可能会很好。转到“ Gson问题列表” 并提出

  • 及其等效的WinApi是流行且有用的宏。原则上,它们使用上的指针算法来恢复指向成员的给定指针所属聚合的指针。 极简主义的实现通常是: 然而,这个宏的使用模式的严格符合性是有争议的。例如: 据我了解,该程序不严格合规,因为: < li >表达式< code>s.b是< code>int类型的左值 < li > <代码> 我注意到问题不在于< code>container_of宏本身。而是构造< co

  • 当我从json中获取数据时,我首先创建一个类,并定义json中的所有变量,以获得严格的数据类型,就像我的json文件一样 所以在角我使类像这样 我不知道如何为下面的json数据创建类 我试图在类中添加数组,但没有得到在angularjs中处理它的最佳方法。

  • HTML5允许更自由地编写一些标记,即没有相应的结束标记。e、 g.无需关闭输入 当你有这样的事情时,它也会抱怨 当遇到“数据库抛出”时,它会抛出一个异常,后面应该跟着 '=' " 这有点烦人,因为它剥夺了HTML5的灵活性。

  • 问题内容: 如何使用java进行json数据解析?有哪些方法? 问题答案: 使用org.json 使用GSON

  • 本文向大家介绍理解javascript中的严格模式,包括了理解javascript中的严格模式的使用技巧和注意事项,需要的朋友参考一下 一、什么是严格模式 我们平时写的JavaScript代码一般都运行在正常模式中的,除了正常运行模式,ECMAscript 5添加了第二种运行模式:”严格模式”(strict mode)。看名字就知道,这种模式会让JavaScript在更严格的环境中运行。 包括IE