在java中解析ISO-8601 DateTime

时间:2013-05-02 11:14:28

标签: java datetime datetime-parsing

我在java中解析日期时遇到了麻烦,我有一个奇怪的日期时间格式。 如何在java中解析2013-04-03T17:04:39.9430000+03:00日期时间以格式化java中的dd.MM.yyyy HH:mm

4 个答案:

答案 0 :(得分:17)

有问题的“奇怪”格式是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

会为您提供您提到的格式。

答案 1 :(得分:9)

TL;博士

OffsetDateTime.parse( "2013-04-03T17:04:39.9430000+03:00" ).format( DateTimeFormatter.ofPattern( "dd.MM.uuuu HH:mm" ) )

ISO 8601

正如其他人所说,你的格式根本不奇怪。实际上它是一种标准格式。该格式是ISO 8601格式定义的集合之一。

微秒

一秒小数的七位数.9430000代表nanoseconds。与最早版本的Java(java.util.Date/.Calendar/java.text.SimpleDateFormat)捆绑在一起的旧日期时间类仅为milliseconds(小数部分的三位数)构建。这些输入值无法由旧类处理。

java.time

幸运的是,Java现在有了更新的日期时间类来取代那些旧类。新的是java.time框架。这些新类可以处理纳秒(最多九位小数),所以没有问题。

java.time框架内置于Java 8及更高版本。在JSR 310中定义。许多功能都被反向移植到Java 6& ThreeTen-Backport项目中的7,并在ThreeTenABP项目中进一步适用于Android。

OffsetDateTime

OffsetDateTime表示时间轴上带有offset-from-UTC的时刻。您的输入字符串2013-04-03T17:04:39.9430000+03:00的偏移量比UTC提前三个小时。

在解析/生成字符串时,java.time类默认使用ISO 8601格式。因此无需定义格式化模式。我们可以直接解析该字符串。

OffsetDateTime odt = OffsetDateTime.parse( "2013-04-03T17:04:39.9430000+03:00" );

生成字符串

要生成相同样式的字符串表示形式,请调用其toString方法。

对于不同的格式,定义格式化模式。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd.MM.uuuu HH:mm" );
String output = odt.format( formatter );

时区

请注意,您的输入具有偏离UTC但不是真正的时区。时区是用于处理夏令时(DST)等异常的偏移规则。对于真正的时区,请使用ZoneId获取ZonedDateTime。搜索Stack Overflow有很多例子。

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

对于在java中使用日期和时间的认真工作,我建议使用比Calendar更好的实现。我会使用Joda,然后您可以使用DateTimeFormatter

答案 3 :(得分:0)

请使用此方法解析没有任何库的ISO8601日期。 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 );

}