如何用可选部分解析日期时间?

时间:2017-02-18 02:28:38

标签: java date datetime java-8 datetime-format

我的日期时间可能是以下格式之一:

  • MM / DD / YY
  • M / DD / YY
  • MM / d / yy的
  • M / d / yy的
  • 上述任何一项HH:mm
  • 以上任何一位有四位数的年份

我构建的DateTimeFormatter如下:

new DateTimeFormatterBuilder()
    .appendValue(ChronoField.MONTH_OF_YEAR, 1, 2, SignStyle.NEVER)
    .appendLiteral('/')
    .appendValue(ChronoField.DAY_OF_MONTH, 1, 2, SignStyle.NEVER)
    .appendLiteral('/')
    .appendValue(ChronoField.YEAR_OF_ERA, 2, 4, SignStyle.NEVER)
    .optionalStart()
    .appendLiteral(' ')
    .appendValue(HOUR_OF_DAY, 2)
    .appendLiteral(':')
    .appendValue(MINUTE_OF_HOUR, 2)
    .toFormatter();

但它无法格式化2/9/17。为什么呢?

1 个答案:

答案 0 :(得分:1)

这有效:

new DateTimeFormatterBuilder()
    .appendValue(ChronoField.MONTH_OF_YEAR, 1, 2, SignStyle.NEVER)
    .appendLiteral('/')
    .appendValue(ChronoField.DAY_OF_MONTH, 1, 2, SignStyle.NEVER)
    .appendLiteral('/')
    .appendValueReduced(ChronoField.YEAR, 2, 4, yearMonth.getYear())
    .appendPattern("[ HH:mm]")
    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
    .toFormatter();

我在回复Meno Hochschild评论时发布的错误是通过设置可选小时和分钟的默认值来修复的。