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
提取一个Instant
。 Instant
类表示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.Date
, Calendar
和SimpleDateFormat
。
Joda-Time项目现在处于维护模式 ,build议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是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的一个试验场。 你可能会在这里find一些有用的类,比如Interval
, YearWeek
, YearQuarter
等等 。