【问题标题】:Is there an efficient way to check if a string represents a date? [duplicate]有没有一种有效的方法来检查字符串是否代表日期? [复制]
【发布时间】:2019-11-07 13:19:24
【问题描述】:

我收到了一个特定格式的 txt。 格式应该以 dd/MM/uuuu 开头。 但是我想检查它是否确实是这种特定格式,否则我的代码会中断。

现在我的想法是检查特定的前 10 个字符(带有分隔符)是否可以定义 LocalDate 对象。所以我想出了这个:

public boolean isDate(String date) {

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
    LocalDate ld = null;
    try {
        ld = LocalDate.parse(date, formatter);
        System.out.println(ld);
    } catch (DateTimeParseException e) {
        System.out.println("Date " + date + " is not a date.");
        return false;

    }

    return true;
}

但是,这不是最佳实践,因为我正在控制程序流,但有例外。另外我必须检查另外 8 个字段来表示时间等。所以我的代码将充满尝试捕获。有没有更有效的方法来解决这个问题?

【问题讨论】:

  • 我不认为在这个例子中这是不好的做法。至少我个人从未听说过 try/catch 块会恶化程序流程。整个测试方法基于将字符串解析为不同数据类型并捕获字符串无法转换的潜在异常的想法。请问您是如何得出在这种情况下捕获异常不是好习惯的结论的?
  • 我认为没有其他选择,除非您使用限制较少的检查,例如正则表达式。
  • 当我只看了这个问题的标题,在点击它查看实际问题之前,我脑海中弹出的解决方案就像你已经做过的一样。
  • 意见总是有效的,我没有多少经验!第 57 条?你说的这个项目是什么?我觉得你在这个问题上想得太远了。这就是在 java 中进行数据类型测试的方式,这是最有效的方式,它读取干净并且不会影响性能,您还想要什么?正如@Kayaman 所说,如果有一个原生的isDate(String string) 方法,这将是它的代码的样子。
  • @Kostas Thanasis - 你没有在这里抛出异常,你正在捕获解析方法抛出的异常。所以你没有违反第 57 条。如果你抛出一个新的异常或重新抛出一个异常,你被捕获了,那么你就违反了上述原则

标签: java validation date-parsing


【解决方案1】:

有问题的代码没有任何问题。它清晰易读,并且没有明显的性能问题(如果你愿意,你可以缓存DateTimeFormatter,但这不会有什么不同)。异常也不会对性能造成重大影响,就像你的 mentioned 一样。

这不是异常控制流的情况。您可以知道它是否是日期的唯一方法是解析它。如果不是,解析器将抛出异常。没有LocalDate.tryParse(),但如果有,它看起来就像问题中的代码。

这是一个“我听说/我在假设之下”的案例,虽然有些事情在过去是一个真正的问题(例如 slow synchronization),但通常它们是基于超过 10 年的过时 Java 版本以前或以错误的方式理解问题(例如异常/控制流)。

【讨论】:

    【解决方案2】:

    我曾经有一个非常有趣的任务 - 检查任何字符串是否代表任何格式的日期。我想出了一个有趣的想法。简而言之,它是保存您希望作为外部属性支持的所有日期格式的列表,然后针对每种格式逐一检查您的字符串。但还有更多。例如格式的顺序很重要。我写了一篇关于这个问题的文章。这是它的链接:Java 8 Java. Time Package: Parsing Any String to Date

    【讨论】:

    • 格式在这里是已知的,为什么要经历这么多麻烦呢?
    • 我提供了一个非常通用的解决方案。这可能是矫枉过正
    • 如果您处于需要支持未知数量的不同格式的特殊情况,您确实需要一个高度依赖数据的定制解决方案。
    • @Joakim Danielson,虽然我理解你为什么认为这不是一个答案,但我不同意。由于您可以使用格式列表中的单一格式来实现此解决方案,并且如果 OP 要求更改为支持多于一种格式,则无需更改代码即可轻松实现。所以我坚持我的回答。还有,对于OP代码中Exception的使用,在这种情况下是有效的,可以接受的
    • 我同意,我阅读的文字更侧重于 try/catch 的使用,并没有仔细阅读标题。因此,问题更多的是 OP 问题的不一致,而不是这个答案。我删除了我的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多