Java日期格式

有String str“2011年5月23日12:20:00”,想把它转换为日期这样:

Date date = (new SimpleDateFormat("MMM dd yyyy HH:mm:ss")).parse(str); 

它总是给我ParseException Unparsable日期格式:’May 23 2011 12:20:00’。

看着类似的问题,似乎一切正常。

哪里不对?

当VM的默认语言环境不是英语时,您可能还需要另外指定语言环境:

 Date date = (new SimpleDateFormat("MMM dd yyyy HH:mm:ss", Locale.US)).parse(str); 

适合我。!

可能这是您使用的工具的问题。 看一眼:

为什么在使用SimpleDateFormat格式化日期然后解析它时会出现ParseException?

尝试在构造SimpleDateFormat对象时指定语言环境。

TL;博士

 LocalDateTime.parse( "May 23 2011 12:20:00" , DateTimeFormatter.ofPattern( "MMM d uuuu HH:mm:ss" , Locale.US ) ) 

使用java.time

Andreas Krueger接受的答案是正确的。 您必须指定Locale以确定翻译月份名称时使用的人类语言。 最好养成在日期时间工作中始终指定区域设置的习惯。

现代方法避免了麻烦的旧日期时间类,而是使用它们的替代品java.time类。

 String input = "May 23 2011 12:20:00" ; 

使用DateTimeFormatter类定义格式设置模式以匹配输入。

Locale确定(a)用于翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大小写,标点符号,分隔符等问题的文化规范。

 Locale locale = Locale.US ; DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMM d uuuu HH:mm:ss" , locale ); 

您的输入缺少时区或从UTC偏移的任何指示。 所以我们解析为LocalDateTime

 LocalDateTime ldt = LocalDateTime.parse( input , f ) ; 

ldt.toString():2011-05-23T12:20:00


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

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