【问题标题】:Java DateTimeFormatter can't convertJava DateTimeFormatter 无法转换
【发布时间】:2018-05-16 15:38:18
【问题描述】:
    String str = "Jan 15";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd");
    LocalDate parsed = LocalDate.parse(str, formatter);

我不断收到此异常:

线程“主”java.time.format.DateTimeParseException 中的异常: 无法在索引 0 处解析文本“Jan 15” java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947) 在 java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849) 在 java.time.LocalDate.parse(LocalDate.java:400) 在 com.mach5.T.main(T.java:17)

有人可以帮我吗?

【问题讨论】:

  • @FairPlay 不,your link 不是重复的。另一个问题是关于从完整的年月日值生成年月字符串,而这个问题是关于解析没有任何年份的月日值。我相信这里的这个问题确实是重复的,但我还没有找到真正的原件。

标签: java datetime-format


【解决方案1】:

tl;博士

解析为MonthDay 而不是LocalDate。

MonthDay.parse( 
    "Jan 15" , 
    DateTimeFormatter.ofPattern( "MMM dd" , Locale.US )
)

--01-15

MonthDay

您的输入缺少年份,因此无法解析为LocalDate。相反,解析为MonthDay。

如果您要解析表示月日的字符串,请使用表示月日值的类。该类将是MonthDay。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMM dd" , Locale.US ) ;
String input =  "Jan 15" ;
MonthDay md = MonthDay.parse( input , f ) ;

md.toString(): --01-15

生成的输出字符串中的双连字符遵循ISO 8601 标准,表示年份未知/省略。

LocalDate

如果知道,您可以指定年份。

LocalDate ld = md.atYear( 2017 ) ;

ld.toString(): 2017-01-15

看到这个code run live at IdeOne.com。


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。

【讨论】:

    【解决方案2】:

    您无法创建没有年份的 LocalDate。

    所以要么你需要添加一个。

            String str = "Jan 15 2016";
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM d yyyy", Locale.ENGLISH);
            LocalDate parsed = LocalDate.parse(str, formatter);
    

    或者可以修改Formatter填写当年,可以查看this post。

        String str = "Jan 15";
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                .appendPattern("MMM d")
                .parseDefaulting(ChronoField.YEAR, Year.now(ZoneId.systemDefault()).getValue())
                .toFormatter(Locale.ENGLISH);;
        LocalDate parsed = LocalDate.parse(str, formatter);
    

    【讨论】:

      【解决方案3】:

      如此处所述,您缺少年份以便能够解析 LocaleDate。

      Java: Unable to obtain LocalDate from TemporalAccessor

      示例:http://tpcg.io/dC93ex

      【讨论】:

        【解决方案4】:

        您可以执行以下操作:

            DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                                        .appendPattern("MMM dd")
                                        .parseDefaulting(ChronoField.YEAR, Year.now(ZoneId.systemDefault()).getValue())
                                        .toFormatter();
            LocalDate parsed = LocalDate.parse(str, formatter);
        

        【讨论】:

          猜你喜欢
          • 2016-09-21
          • 1970-01-01
          • 1970-01-01
          • 2017-08-31
          • 1970-01-01
          • 2022-06-27
          • 1970-01-01
          • 2015-07-14
          • 1970-01-01
          相关资源
          最近更新 更多