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.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
- Java SE 8 , Java SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和Java SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
- 请参见如何使用ThreeTenABP ….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。