【问题标题】:Unable to obtain LocalDate from TemporalAccessor using quarters无法使用宿舍从 TemporalAccessor 获取 LocalDate
【发布时间】:2019-03-20 19:41:59
【问题描述】:

我正在尝试将一些日期字符串解析为日期值,但是,使用下面的代码,我得到了一个异常:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("Q'Q'uuuu - MMM");

String d = "3Q2016 - Aug";
System.out.println(LocalDate.parse(d, formatter));

异常如下

java.time.format.DateTimeParseException: Text '3Q2016 - Aug' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {MonthOfYear=8, QuarterOfYear=3, Year=2016},ISO of type java.time.format.Parsed

查看异常,我看到了正确的数据,但由于某种原因无法解析。

我看到的其他类似主题建议使用 LocalDate 或 LocalDateTime,但都不起作用。

【问题讨论】:

    标签: java datetime java-8


    【解决方案1】:

    这是因为指定的字符串没有要选择的特定日期。您可能需要使用YearMonth 而不是LocalDateTime,然后使用YearMonth.atDay(1) 对其进行转换以获得该月的第一天。

    【讨论】:

    • 正确。在英语语言环境中 YearMonth.parse(d, formatter).atDay(1) 产生 2016-08-01
    • 谢谢,我不知道它需要指向特定日期。这为我指明了正确的方向!
    • 是的,@Holger。或者你坚持YearMonth。有很多可能性,每一种都有它的位置。
    【解决方案2】:

    正如this answer 中所说,您需要指定一天才能解析为LocalDate。因此,一种解决方案是改为解析为YearMonth,然后通过指定一天后转换为LocalDate

    或者您首先创建一个具有固定日期的DateTimeFormatter

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendPattern("Q'Q'uuuu - MMM")
        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
        .toFormatter(Locale.US);
    String d = "3Q2016 - Aug";
    System.out.println(LocalDate.parse(d, formatter));
    

    我使用toFormatter(Locale.US) 使示例适用于所有环境。在输入字符串与当前语言环境匹配的环境中,您可以改用toFormatter()

    【讨论】:

      【解决方案3】:

      尝试在日期中添加时间部分 -

      String str = "2Q1986 - Apr - 08 T00:00";
      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("Q'Q'yyyy - MMM - dd 'T'hh:mm");
      LocalDate dateTime = LocalDate.parse(str, formatter);
      

      【讨论】:

      • 虽然此解决方案有效(并产生1986-04-08),但当我们最终想要(并得到)LocalDate 时,添加一天中的时间过度杀伤力(我没有投反对票;我认为答案仍然有帮助)。
      猜你喜欢
      • 2018-01-01
      • 2019-12-20
      • 2016-05-19
      • 2019-04-16
      • 2020-07-29
      • 2019-12-04
      • 2022-12-13
      • 2017-09-29
      • 1970-01-01
      相关资源
      最近更新 更多