首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java DateTimeFormatter无法转换

Java DateTimeFormatter无法转换
EN

Stack Overflow用户
提问于 2017-12-02 19:51:38
回答 4查看 2.5K关注 0票数 1
代码语言:javascript
复制
    String str = "Jan 15";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd");
    LocalDate parsed = LocalDate.parse(str, formatter);

我一直有这样的例外:

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

有人能帮我吗?

EN

回答 4

Stack Overflow用户

发布于 2017-12-02 21:13:14

tl;dr

解析为MonthDay而不是LocalDate

代码语言:javascript
复制
MonthDay.parse( 
    "Jan 15" , 
    DateTimeFormatter.ofPattern( "MMM dd" , Locale.US )
)

-01-15

MonthDay

您的输入缺少一年,因此不能将其解析为LocalDate。相反,将其解析为MonthDay

如果要解析一个表示一个月日期的字符串,请使用一个表示月日值的类。那堂课是MonthDay

代码语言:javascript
复制
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

如果知道的话,你可以分配一年。

代码语言:javascript
复制
LocalDate ld = md.atYear( 2017 ) ;

ld.toString():2017-01-15

看这个在IdeOne.com现场运行的代码

关于java.time

java.time框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.DateCalendarSimpleDateFormat

尤达-时间项目现在在维护模式中,建议迁移到java.time类。

要了解更多信息,请参见Oracle教程。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310

在哪里获得java.time类?

  • Java 8Java 9,以及后来的
    • 内置的。
    • 带有捆绑实现的标准Java的一部分。
    • Java 9添加了一些次要的特性和修复。

  • Java 6Java 7
    • java.time的大部分功能都是在http://www.threeten.org/threetenbp/中移植到Java6&7中的。

三次-额外项目使用其他类扩展java.time。这个项目是将来可能加入java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter更多

票数 2
EN

Stack Overflow用户

发布于 2017-12-02 20:11:30

您可以执行以下操作:

代码语言:javascript
复制
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                                .appendPattern("MMM dd")
                                .parseDefaulting(ChronoField.YEAR, Year.now(ZoneId.systemDefault()).getValue())
                                .toFormatter();
    LocalDate parsed = LocalDate.parse(str, formatter);
票数 1
EN

Stack Overflow用户

发布于 2017-12-02 20:11:57

没有一年就不能创建LocalDate。

所以要么你需要加一个。

代码语言:javascript
复制
        String str = "Jan 15 2016";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM d yyyy", Locale.ENGLISH);
        LocalDate parsed = LocalDate.parse(str, formatter);

或者您可以修改格式化程序以填写当前年份,也可以检查这个职位

代码语言:javascript
复制
    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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47611900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档