Java – parsingdate

我试图parsing一个date,但我奇怪地得到一个例外。

这是代码:

import java.util.Date; String strDate = "Wed, 09 Feb 2011 12:34:27"; Date date; SimpleDateFormat FORMATTER = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss"); try { date = FORMATTER.parse(strDate.trim()); System.out.println(date); } catch (ParseException e) { e.printStackTrace(); } 

例外是:

(DateTest.java:17)上的java.text.DateFormat.parse(DateFormat.java:337):java.text.ParseException:Unparseable date:“Wed,09 Feb 2011 12:34:27”

我已阅读文档 ,我认为我的模式是正确的。 所以我不明白…

任何想法?

谢谢!

这可能是因为您的计算机上的默认语言环境不是英语。

你应该使用:

 new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.ENGLISH); 

代替。

TL;博士

 java.util.Date.from ( LocalDateTime.parse( "Wed, 09 Feb 2011 12:34:27" , DateTimeFormatter.ofPattern( "EEE, dd MMM uuuu HH:mm:ss" , Locale.US ) ).atZone( ZoneId.of( "America/Montreal" ) ) .toInstant() ) 

细节

问题和其他答案都使用过时的麻烦旧的date时间类,现在是遗留的,由java.time类代替。

使用java.time

inputstring没有任何时区或从UTC偏移的指示。 所以我们parsing为OffsetDateTime

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

 String input = "Wed, 09 Feb 2011 12:34:27" ; Locale l = Locale.US ; DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE, dd MMM uuuu HH:mm:ss" , l ) ; LocalDateTime ldt = LocalDateTime.parse( input , f ) ; 

ldt.toString():2011-02-09T12:34:27

时区

问题和其他答案都忽略了时区的关键问题。

inputstring缺less时区或偏移量。 我们parsing为一个LocalDateTime ,它不是时间轴上的一个时刻,只是关于可能时刻的一个模糊的想法。 就像说“圣诞节从2017年12月25日午夜开始”一样,除非你把它放在特定时区的背景下,否则这毫无意义。 圣诞节在奥克兰新西兰比在法国巴黎早得多,晚些时候还在魁北克蒙特利尔。

如果您知道预期的时区,请指定ZoneId以生成ZonedDateTime

 ZoneId z = ZoneId.of( "America/Montreal" ) ; ZonedDateTime zdt = ldt.atZone( z ); // Assigning a time zone to determine an actual moment on the timeline. 

转换

最好避免麻烦的旧的遗留date时间课程。 但是,如果您必须与尚未更新为java.timetypes的旧代码交互,则可以在旧类和java.time之间进行转换。 寻找新的方法添加到旧的类。

java.util.Date是UTC时间轴上的一个时刻。 所以我们需要从ZonedDateTime提取一个InstantInstant类表示UTC时间轴上的一个时刻,分辨率为纳秒 (最多九(9)位小数)。

 Instant instant = zdt.toInstant() ; java.util.Date d = java.util.Date.from( instant ) ; // Convert from java.time to legacy class. 

走向另一个方向。

 Instant instant = d.toInstant() ; // Convert from legacy class to java.time class. ZonedDateTime zdt = instant.atZone( z ) ; // Adjust from UTC into a particular time zone. 

关于java.time

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

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

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是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的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter 等等 。