gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:25:53 27 4
gpt4 key购买 nike

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

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/

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