在java中parsingISO-8601 DateTime
我在java中parsingdate时间有困难,我有一个奇怪的date时间格式。 如何parsing2013-04-03T17:04:39.9430000+03:00
date时间在Java中格式化dd.MM.yyyy HH:mm
在java中?
你所说的“奇怪”的格式实际上是ISO-8601格式,这是相当广泛的使用。 您可以使用SimpleDateFormat以多种方式重新格式化它:
SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); DateTime dtIn = inFormat.parse(dateString}); //where dateString is a date in ISO-8601 format SimpleDateFormat outFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm"); String dtOut = outFormat.format(dtIn); //parse it into a DateTime object if you need to interact with it as such
会给你你提到的格式。
TL;博士
OffsetDateTime.parse( "2013-04-03T17:04:39.9430000+03:00" ).format( DateTimeFormatter.ofPattern( "dd.MM.uuuu HH:mm" ) )
ISO 8601
正如其他人指出的,你的格式根本不奇怪。 确实这是一个标准格式。 该格式是由ISO 8601格式定义的集合之一。
微秒
这些七位数的秒,即.9430000
,代表纳秒 。 与最早版本的Java(java.util.Date/.Calendar/java.text.SimpleDateFormat)捆绑在一起的旧date – 时间类仅在毫秒 (三位小数)内部生成。 这样的input值不能由旧类来处理。
java.time
幸运的是,Java现在有了更新的date – 时间类来取代这些旧的类。 新的是在java.time框架中。 这些新的类可以处理纳秒(最多九位数的小数),所以没有问题。
java.time框架内置于Java 8及更高版本中。 在JSR 310中定义。 大部分function都被移植到ThreeTen-Backport项目中的Java 6和7中,并在ThreeTenABP项目中进一步适用于Android。
OffsetDateTime
OffsetDateTime
表示时间轴上的一个时刻,与UTC的偏移量 。 您的inputstring2013-04-03T17:04:39.9430000+03:00
的偏移2013-04-03T17:04:39.9430000+03:00
UTC UTC前三个小时。
在parsing/生成string时,java.time类默认使用ISO 8601格式。 所以不需要定义格式化模式。 我们可以直接parsing这个string。
OffsetDateTime odt = OffsetDateTime.parse( "2013-04-03T17:04:39.9430000+03:00" );
生成string
要以相同样式生成string表示forms,请调用其toString
方法。
对于不同的格式定义格式模式。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd.MM.uuuu HH:mm" ); String output = odt.format( formatter );
时区
请注意,您的input有一个从UTC的偏移量,但不是一个真正的时区。 时区是偏移加上处理exception情况(如夏令时(DST))的规则。 对于真正的时区,使用ZoneId
来获取ZonedDateTime
。 search堆栈溢出了很多例子。
关于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
等等 。
对于在Java中的date和时间认真的工作,我会build议使用比日历的东西更好的实现。 我会使用Joda ,并且可以使用DateTimeFormatter
请使用这个方法parsingISO8601date没有任何库。 http://www.java2s.com/Code/Java/Data-Type/ISO8601dateparsingutility.htm
public static Date parseISO8601Date(String input ) throws java.text.ParseException { //NOTE: SimpleDateFormat uses GMT[-+]hh:mm for the TZ which breaks //things a bit. Before we go on we have to repair this. SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ssz" ); //this is zero time so we need to add that TZ indicator for if ( input.endsWith( "Z" ) ) { input = input.substring( 0, input.length() - 1) + "GMT-00:00"; } else { int inset = 6; String s0 = input.substring( 0, input.length() - inset ); String s1 = input.substring( input.length() - inset, input.length() ); input = s0 + "GMT" + s1; } return df.parse( input ); }