在java中parsingISO-8601 DateTime

我在java中parsingdate时间有困难,我有一个奇怪的date时间格式。 如何parsing2013-04-03T17:04:39.9430000+03:00date时间在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.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 等等 。

对于在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 ); }