java - (重新)使用 DateTimeFormatter 解析日期范围或将 DateTimeFormatter 与正则表达式混合

标签 java regex date localdate

我有以下字符串表示我需要解析的日期范围:

2018-10-20:2019-10-20

它由 2 个由 分隔的 ISO 日期字符串组成:

通过将重复的日期范围与其他文本混合在一起,字符串可能会变得更加复杂。这可以通过正则表达式来完成。

但是,鉴于最新的 Java 具有日期/时间支持,这里和其他地方的大多数编码人员都对此感到欣喜若狂,是否可以使用 LocalDate 的解析器或自定义 DateTimeFormatter 以便识别字符串中作为 ISO 日期候选的位并捕获它们?

更好的是,我如何从 DateTimeFormatter 中提取验证正则表达式(标识 ISO 日期的正则表达式,假设有一个)并将其与我自己的正则表达式合并/编译其余部分字符串的。

我只是觉得在代码中编写另一个 ISO 日期正则表达式不太舒服,因为 Java 中可能已经有一个正则表达式可以做到这一点,而我只是重复使用它。

请注意,我并不是要求正则表达式。我能做到。

另请注意,我的示例字符串可以包含其他日期/时间格式,例如带有时区和毫秒以及所有的口哨声。

最佳答案

实际上,DateTimeFormatter 没有内部正则表达式。它uses a CompositePrinterParser ,它又使用 array of DateTimePrinterParser instances (这是一个 inner interface of DateTimeFormatterBuilder ),其中每个实例负责解析/格式化特定字段。

IMO,正则表达式不是最好的方法。如果您知道所有日期均由 : 分隔,为什么不简单地拆分字符串并尝试单独解析各个部分呢?类似这样的事情:

String dates = // big string with dates separated by :

DateTimeFormatter parser = // create a formatter for your patterns
for (String s : dates.split(":")) {
    parser.parse(s); // if "s" is invalid, it throws exception
}

如果您只想验证字符串,按上面的方式调用 parse 就足够了 - 如果字符串无效,它会抛出异常。

要支持多种格式,您可以使用DateTimeFormatterBuilder::appendOptional。示例:

DateTimeFormatter parser = new DateTimeFormatterBuilder()
    // full ISO8601 with date/time and UTC offset (ex: 2011-12-03T10:15:30+01:00)
    .appendOptional(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
    // date/time without UTC offset (ex: 2011-12-03T10:15:30)
    .appendOptional(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
    // just date (ex: 2011-12-03)
    .appendOptional(DateTimeFormatter.ISO_LOCAL_DATE)
    // some custom format (day/month/year)
    .appendOptional(DateTimeFormatter.ofPattern("dd/MM/yyyy"))
    // ... add as many you need
    // create formatter
    .toFormatter();

支持多种格式的正则表达式(正如您所说,“其他日期/时间格式,例如时区、毫秒和所有口哨”)是可能的,但正则表达式不能很好地验证日期 - 例如零日之类的东西,天 > 30 不适用于所有月份,非闰年的 2 月 29 日,分钟 > 60 等。

DateTimeFormatter 将验证所有这些棘手的细节,而正则表达式只能保证数字和分隔符位于正确的位置,而不会验证这些值。因此,无论正则表达式如何,您都必须解析日期(恕我直言,这使得在这种情况下使用正则表达式几乎毫无用处)。

关于java - (重新)使用 DateTimeFormatter 解析日期范围或将 DateTimeFormatter 与正则表达式混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49633953/

相关文章:

java - 是否有用于 APT 的 Java 库?

java - Android:无法从静态上下文中引用非静态方法。使困惑?

regex - 用于将正则表达式转换为 NFA 的库?

date - Dart :在字符串中找到第一个数字并剪切字符串

java - 从 JFrame 访问方法

java - Android Put方法错误

javascript - UIWebView 的 JavaScript 评估器是否能够使用 JS 的 RegExp 对象?

python - 如何知道如何重新使用什么来分割字符串?

Excel显示当月第n天

date - 计划任务日志到以当前日期命名的文件