【问题标题】:Parse ISO-date with lower specificity以较低的特​​异性解析 ISO 日期
【发布时间】:2018-07-26 02:07:42
【问题描述】:

我正在尝试解析符合 ISO8601 标准的字符串,这些字符串仅指定到某一点的日期,例如 2018-02 表示 2018 年 2 月,跳过这一天。

java.time 包似乎无法解析此类字符串。我尝试了以下方法:

Instant.parse("2018-02");
LocalDateTime.parse("2018-02")
LocalDate.parse("2018-02", DateTimeFormatter.ISO_DATE);

失败并出现以下错误

DateTimeParseException:无法在索引 7 处解析文本“2018-02”

我也尝试了以下方法,但我实际上并不想指定确切的模式而只是接受所有符合 ISO8601 的内容:

LocalDate.parse("2018-02", DateTimeFormatter.ofPattern("yyyy-MM"));

失败:

java.time.format.DateTimeParseException:无法解析文本“2018-02”:无法从 TemporalAccessor 获取 LocalDate:{MonthOfYear=2, Year=2018},java.time.format.Parsed 类型的 ISO /p>

有没有办法使用java.time 包解析此类 ISO8601 字符串?

【问题讨论】:

  • 嗯,日期是 day 而不是 month ... - 你可以假设一天,例如第一个,并将其附加到您获得的日期字符串中。
  • 你的字符串总是这样,还是需要解析2018-022018-02-152018-02-15T12等?
  • 从技术上讲,我只需要解析 yyyy-MM,但我想通过接受任何 ISO8601 日期(包括 yyyy-MM-dd 和 time-parts)使其更健壮

标签: java java-time iso8601 localdate


【解决方案1】:

是的,你可以使用the YearMonth class

YearMonth ym = YearMonth.parse("2018-02");

(输入是 ISO 格式,所以这里不需要提供格式化程序)。


更新

在评论中,您指出输入可能是2018-022018-02-01,在这种情况下您想忽略这一天。在这种情况下,您可以使用:

//note the optional day
DateTimeFormatter FMT = DateTimeFormatter.ofPattern("yyyy-MM[-dd]");

YearMonth ym = YearMonth.from(FMT.parseBest(input, YearMonth::from, LocalDate::from));

【讨论】:

  • 对我有用,但有没有办法通过解析任意 ISO8601 本地日期来获取 YearMonth 实例?对于2018-02-01 或更高的精度,这将失败,如果 somone 决定将月份精度的日期输出为全精度 ISO8601 日期,这是一个可能的输入
  • 我建议你澄清你的问题 - 在这种情况下你想要什么输出?本地日期?当输入为2018-02 时,您还想要一个 LocalDate 吗?在这种情况下,应该使用哪一天?
  • 我想要一个YearMonth。它应该丢弃不必要的精度
猜你喜欢
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2021-01-17
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多