解析"整数" DateTimeFormatter使用可选部分的时间

时间:2016-02-02 10:01:31

标签: java datetime date-formatting java-time

我是一些数据库,我有LocalTime的自定义格式,我正在尝试为其构建DateTimeFormatter

有以下规则:

  • 0 => 00:00
  • 10 => 00:10
  • 111 => 1:11
  • 101 => 1:01
  • 1111 => 11:11

在这样的格式化程序中可以有[]的可选部分,但我不确定是否可以将这些规则应用于这样的格式化程序。

使用find ./path -name *.log -print0 | xargs -0 -i bash -c "if [ '0' == $(cat $0 | grep -c \"ren0 \[RenderJob\] Render time:\") ]; then echo $0; fi" {} 时,可以解析900和1111,但是11(显然)不能解析。

但是使用DateTimeFormatter.ofPattern("Hmm"),900和1111都无法解析。

但是[H]mm,可以解析1111,但不能解析900

我试过像

这样的东西
[HH]mm

但这不起作用,抛出像

这样的异常
  

线程中的异常" main" java.time.format.DateTimeParseException:Text' 1111'无法在索引4处解析

2 个答案:

答案 0 :(得分:3)

DateTimeFormatter中没有可以解析你想要的模式。此外,DateTimeFormatterBuilder无法帮助您。主要的问题是解析器是贪婪的,所以设置的任何东西都会解析前一个/两个数字作为小时,剩下剩下的分钟。这与您的规格不符。

选项1:

使用这种方法:

DateTimeFormatter f = new DateTimeFormatterBuilder()
    .appendValue(HOUR_OF_DAY)
    .appendValue(MINUTE_OF_HOUR, 2)
    .toFormatter();
LocalTime time = LocalTime.parse("0000" + str, f);

这种方法使模式规则,具有固定的数字位数。应该注意的是DateTimeFormatter.ofPattern("Hmm")也可以使用,但我使用上面的长形式使其更加明显。

选项2:

编写TemporalField的实现,处理上面定义的整数格式。然后在DateTimeFormatterBuilder中使用它。这对于这种需求来说要困难得多,但这里提到的是完整性。

答案 1 :(得分:2)

这是一个解决方案:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .optionalStart()
            .appendValue(ChronoField.HOUR_OF_DAY, 2)
            .appendValue(ChronoField.MINUTE_OF_HOUR, 2)
            .optionalEnd()
            .optionalStart()
            .appendValue(ChronoField.HOUR_OF_DAY, 1)
            .appendValue(ChronoField.MINUTE_OF_HOUR, 2)
            .optionalEnd()
            .optionalStart()
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .appendValue(ChronoField.MINUTE_OF_HOUR)
            .optionalEnd()
            .toFormatter();