gpt4 book ai didi

Java 8 DateTimeFormatterBuilder().appendOptional 不工作

转载 作者:搜寻专家 更新时间:2023-10-31 20:08:42 24 4
gpt4 key购买 nike

我的要求是根据指定的一组有效格式验证日期字符串的格式是否正确。

有效格式:

MM/dd/yy
MM/dd/yyyy

我创建了一个简单的测试方法,它使用 Java 8 DateTimeFormatterBuilder 创建一个支持多种可选格式的灵活格式化程序。这是代码:

public static void test() {
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendOptional(DateTimeFormatter.ofPattern("MM/dd/yy"))
.appendOptional(DateTimeFormatter.ofPattern("MM/dd/yyyy"))
.toFormatter();

String dateString = "10/30/2017";

try {
LocalDate.parse(dateString, formatter);
System.out.println(dateString + " has a valid date format");
} catch (Exception e) {
System.out.println(dateString + " has an invalid date format");
}
}

当我运行它时,这是输出

10/30/2017 has an invalid date format

正如您在代码中看到的,有效的日期格式是 MM/dd/yy 和 MM/dd/yyyy。我的期望是日期 10/30/2017 应该有效,因为它匹配 MM/dd/yyyy。但是,10/30/2017 被报告为无效。

出了什么问题?为什么这不起作用?

我也试过

.appendOptional(DateTimeFormatter.ofPattern("MM/dd/yy[yy]"))

代替

.appendOptional(DateTimeFormatter.ofPattern("MM/dd/yy"))
.appendOptional(DateTimeFormatter.ofPattern("MM/dd/yyyy"))

但仍然有同样的问题。

如果我使用,此代码将按预期运行:

String dateString = "10/30/17";

代替

String dateString = "10/30/2017";

我有两个问题

  1. 这里出了什么问题?为什么它不适用于“10/30/2017”?

  2. 使用Java 8,如何正确创建灵活的日期格式器(支持多种可选格式的格式器)?我知道使用 [] 在模式字符串本身中创建可选部分。我正在寻找与我正在尝试的更相似的东西(避免在模式字符串中使用 [] 并为每个单独的格式字符串使用单独的可选子句)

最佳答案

格式化程序没有按照您期望的方式工作,可选部分意味着

  • 如果第一个模式没有附加任何额外内容(例如“MM/dd/yy”),那很好,
  • 如果有额外的东西,它需要匹配第二个模式(例如,“MM/dd/yyyy”)

为了更清楚一点,尝试运行下面的示例代码以更好地理解它:

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendOptional(DateTimeFormatter.ofPattern("MM/dd/yy"))
.appendOptional(DateTimeFormatter.ofPattern("MM/dd/yyyy"))
.toFormatter();

String[] dateStrings = {
"10/30/17", // valid
"10/30/2017", // invalid
"10/30/1710/30/2017", // valid
"10/30/201710/30/17" // invalid
};

for (String dateString : dateStrings) {
try {
LocalDate.parse(dateString, formatter);
System.out.println(dateString + " has a valid date format");
} catch (Exception e) {
System.err.println(dateString + " has an invalid date format");
}
}

==

10/30/17 has a valid date format
10/30/1710/30/2017 has a valid date format
10/30/2017 has an invalid date format
10/30/201710/30/17 has an invalid date format

==

这只是一个简单的解决方案,如果您关心性能,捕获解析异常的验证应该是最后的手段

  • 在进行日期字符串解析之前,您可以先按长度或正则表达式检查字符串
  • 您也可以用包含简单 for 循环等的方法替换流

    String[] patterns = { "MM/dd/yy", "MM/dd/yyyy" };
    Map<String, DateTimeFormatter> formatters = Stream.of(patterns).collect(Collectors.toMap(
    pattern -> pattern,
    pattern -> new DateTimeFormatterBuilder().appendOptional(DateTimeFormatter.ofPattern(pattern)).toFormatter()
    ));

    String dateString = "10/30/17";
    boolean valid = formatters.entrySet().stream().anyMatch(entry -> {
    // relying on catching parsing exception will have serious expense on performance
    // a simple check will already improve a lot
    if (dateString.length() == entry.getKey().length()) {
    try {
    LocalDate.parse(dateString, entry.getValue());
    return true;
    }
    catch (DateTimeParseException e) {
    // ignore or log it
    }
    }
    return false;
    });

关于Java 8 DateTimeFormatterBuilder().appendOptional 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47997701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com