93

次のような日付を解析しようとしています。

2010-04-05T17:16:00Z

これはhttp://www.ietf.org/rfc/rfc3339.txtによる有効な日付です。'Z' リテラル (引用符) "は、UTC が指定された時間の優先基準点であることを意味します。 "

SimpleDateFormat とこのパターンを使用して解析しようとすると:

yyyy-MM-dd'T'HH:mm:ss

Mon Apr 05 17:16:00 EDT 2010 として解析されます。


SimpleDateFormat次のパターンの文字列を解析できません:

yyyy-MM-dd'T'HH:mm:ssz
yyyy-MM-dd'T'HH:mm:ssZ

で使用するTimeZoneを明示的に設定してSimpleDateFormat、期待される出力を得ることができますが、それは必要ではないと思います。足りないものはありますか?代替の日付パーサーはありますか?

4

12 に答える 12

63

JavaはISO日付を正しく解析しません。

マッケンジーの答えに似ています。

Z解析する前に修正するだけです。

コード

String string = "2013-03-05T18:05:05.000Z";
String defaultTimezone = TimeZone.getDefault().getID();
Date date = (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")).parse(string.replaceAll("Z$", "+0000"));

System.out.println("string: " + string);
System.out.println("defaultTimezone: " + defaultTimezone);
System.out.println("date: " + (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")).format(date));

結果

string: 2013-03-05T18:05:05.000Z
defaultTimezone: America/New_York
date: 2013-03-05T13:05:05.000-0500
于 2013-03-05T18:40:23.707 に答える
59

解析している日付はISO 8601形式です。

Java 7 では、タイムゾーン サフィックスを読み取って適用するパターンは次のようになります。yyyy-MM-dd'T'HH:mm:ssX

于 2014-06-24T18:46:52.197 に答える
32

このパターンに含まれる「z」日時コンポーネントは、タイムゾーン形式が一般的なタイムゾーンの「標準」に準拠する必要があることを示しています。その例はPacific Standard Time; PST; GMT-08:00です。

「Z」は、タイムゾーンがRFC 822 タイムゾーン標準に準拠していることを示します-0800

DatatypeConverter が必要だと思います...

@Test
public void testTimezoneIsGreenwichMeanTime() throws ParseException {
    final Calendar calendar = javax.xml.bind.DatatypeConverter.parseDateTime("2010-04-05T17:16:00Z");
    TestCase.assertEquals("gotten timezone", "GMT+00:00", calendar.getTimeZone().getID());
}
于 2010-04-05T20:47:36.737 に答える
23

Java 7 APIのDate and Time Patternsテーブルの最後の行によると

X タイム ゾーン ISO 8601 タイム ゾーン -08; -0800; -08:00

ISO 8601 タイム ゾーンの場合は、次を使用する必要があります。

  • (-08 または Z) の場合は X、
  • (-0800 または Z) の XX、
  • (-08:00 または Z) の XXX;

したがって、「2010-04-05T17:16:00Z」を解析するには、 「yyyy-MM-dd'T'HH:mm:ssX」または「yyyy-MM-dd'T'HH:mm:ssXX」のいずれかを使用できます。または "yyyy-MM-dd'T'HH:mm:ssXXX"

    System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX").parse("2010-04-05T17:16:00Z"));
    System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXX").parse("2010-04-05T17:16:00Z"));
    System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX").parse("2010-04-05T17:16:00Z"));

「Mon Apr 05 13:16:00 EDT 2010」が正しく出力されます

于 2016-05-11T21:41:01.040 に答える
7

「X」は、部分的な秒が存在しない場合にのみ機能します。つまり、SimpleDateFormat パターン

"yyyy-MM-dd'T'HH:mm:ssX"

正しく解析します

"2008-01-31T00:00:00Z"

しかし

"yyyy-MM-dd'T'HH:mm:ss.SX"

解析しません

"2008-01-31T00:00:00.000Z"

残念ながら、秒の一部を含む日時は有効な ISO 日付ではないようです: http://en.wikipedia.org/wiki/ISO_8601

于 2015-03-23T12:23:50.047 に答える
4

SimpleDateFormatで適切に解析するには、タイムゾーンを「GMT + 00:00」または0000のようにする必要があります。Zをこの構造に置き換えることができます。

于 2010-04-05T20:36:09.033 に答える
2

JSR-310 に関して、関心のある別のプロジェクトはthreetenbpかもしれません。

JSR-310 は、Java SE 8 用の新しい日付と時刻のライブラリを提供します。このプロジェクトは、Java SE 6 および 7 へのバックポートです。

Androidプロジェクトに取り組んでいる場合は、 ThreeTenABP ライブラリをチェックアウトすることをお勧めします。

compile "com.jakewharton.threetenabp:threetenabp:${version}"

JSR-310 は Java 8 に java.time.* パッケージとして含まれていました。これは、Java と Android の両方で問題のある Date および Calendar API を完全に置き換えるものです。JSR-310 は、その作成者である Stephen Colebourne によって Java 6 にバックポートされ、そこからこのライブラリが適合されました。

于 2016-03-24T14:29:46.453 に答える
2

restlet プロジェクトには、RFC 3339 の日付を解析できる InternetDateFormat クラスが含まれています。

Restlet InternetDateFormat

ただし、解析する前に、末尾の「Z」を「UTC」に置き換えたい場合があります。

于 2010-04-05T20:57:27.530 に答える
2

api-client-libraryGoogleが見つけた別の回答を提供します

try {
    DateTime dateTime = DateTime.parseRfc3339(date);
    dateTime = new DateTime(new Date(dateTime.getValue()), TimeZone.getDefault());
    long timestamp = dateTime.getValue();  // get date in timestamp
    int timeZone = dateTime.getTimeZoneShift();  // get timezone offset
} catch (NumberFormatException e) {
    e.printStackTrace();
}

インストール ガイド、
https://developers.google.com/api-client-library/java/google-api-java-client/setup#download

API リファレンスはこちら
https://developers.google.com/api-client-library/java/google-http-java-client/reference/1.20.0/com/google/api/client/util/DateTime

DateTimeクラスのソースコード
https://github.com/google/google-http-java-client/blob/master/google-http-client/src/main/java/com/google/api/client/util/DateTime .java

DateTime単体テスト、
https://github.com/google/google-http-java-client/blob/master/google-http-client/src/test/java/com/google/api/client/util/DateTimeTest.java #L121

于 2016-03-17T08:15:47.283 に答える