Java DateTimeFormatter无法转换

时间:2017-12-02 19:51:39

标签: java datetime-format

    String str = "Jan 15";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd");
    LocalDate parsed = LocalDate.parse(str, formatter);

我一直得到这个例外:

  

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

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:2)

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.DateCalendar和& SimpleDateFormat

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:1)

您可以执行以下操作:

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

答案 2 :(得分:1)

如果没有一年,您无法创建LocalDate。

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

        String str = "Jan 15 2016";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM d yyyy", Locale.ENGLISH);
        LocalDate parsed = LocalDate.parse(str, 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 :(得分:1)

如上所述,您错过了这一年,以便能够解析LocaleDate。

Java: Unable to obtain LocalDate from TemporalAccessor

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