无法使用季度从TemporalAccessor获取LocalDate

时间:2019-03-20 19:42:00

标签: java datetime java-8

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

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,但都不起作用。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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()

答案 2 :(得分:-1)

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

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);