web-dev-qa-db-ja.com

この日付フォーマットは何ですか? 2011-08-12T20:17:46.384Z

私の日付は2011-08-12T20:17:46.384Zです。これはどんなフォーマットですか?私はDateFormat.getDateInstance().parse(dateStr)経由でJava 1.4でそれを解析しようとしています

Java.text.ParseException:解析不可能な日付: "2011-08-12T20:17:46.384Z"

構文解析には SimpleDateFormat を使うべきだと思いますが、最初にフォーマット文字列を知る必要があります。この文字列でTが何を意味するのか分からないので、これまでに私が持ってきたのはyyyy-MM-ddだけです。この日付ストリングは、 ファイルCMISダウンロード履歴メディア・タイプ に示されているlcmis:downloadedOnタグから来ています。

266
Sarah Vessels

Tは、日付と時刻を区別するための単なるリテラルです。Zは、「Zulu time」(UTC)とも呼ばれる「ゼロ時オフセット」を意味します。文字列に常に "Z"がある場合は、次のように使用できます。

SimpleDateFormat format = new SimpleDateFormat(
    "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));

または Joda Time を使用して、 ISODateTimeFormat.dateTime() を使用することもできます。

374
Jon Skeet

tl; dr

標準の ISO 8601 形式は入力文字列で使用されます。

Instant.parse ( "2011-08-12T20:17:46.384Z" ) 

ISO 8601

このフォーマットは実用的な実用規格である ISO 8601 で定義されています。

Tname__は、日付部分と時刻部分を区切ります。末尾のZname__は、 _ utc _ を意味します(つまり、UTCからのオフセットが0時 - 分 - 秒)。 Zname__は 発音された「Zulu」 です。

Java.time

初期のバージョンのJavaにバンドルされている古い日時クラスは、設計が不十分で、混乱しやすく、面倒です。避けてください。

代わりに、Java 8以降に組み込まれている Java.time フレームワークを使用してください。 Java.timeクラスは、古い日付時刻クラスと非常に成功したJoda-Timeライブラリの両方に取って代わります。

Java.timeクラスは、日付/時刻値のテキスト表現を解析/生成するときに、デフォルトで ISO 8601 を使用します。

Instantname__ クラスは、 _ utc _ のタイムライン上の瞬間を ナノ秒 の分解能で表します。そのクラスはフォーマットパターンを定義するために煩わされることなくあなたの入力文字列を直接解析することができます。

Instant instant = Instant.parse ( "2011-08-12T20:17:46.384Z" ) ;

Java.timeについて

Java.time フレームワークは、Java 8以降に組み込まれています。これらのクラスは、 Java.util.DateCalendarname__ 、& SimpleDateFormatname__ などの厄介な古い レガシー 日時クラスに代わるものです。

Joda-Time プロジェクトは メンテナンスモード になり、 Java.time クラスへの移行を推奨します。

詳細については、 Oracleチュートリアル を参照してください。そして多くの例と説明についてはStack Overflowを検索してください。指定は JSR 310 です。

Java.timeクラスはどこで入手できますか?

  • Java SE 8Java SE 9 、およびそれ以降
    • ビルトイン。
    • バンドル実装の標準Java APIの一部。
    • Java 9では、いくつかのマイナーな機能と修正が追加されています。
  • Java SE 6 および Java SE 7
    • Java.time機能の多くは、 ThreeTen-Backport でJava 6および7にバックポートされています。
  • Android
    • Java.timeクラスのAndroidバンドル実装の最新バージョン。
    • 以前のAndroidでは、 ThreeTenABP プロジェクトに適応していますThreeTen-Backport(前述) 。 ThreeTenABPの使い方… を参照してください。

ThreeTen-Extra プロジェクトは、追加クラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明するものです。 Intervalname__YearWeekname__YearQuartername__more など、便利なクラスがいくつかあります。

39
Basil Bourque

Javaの構文解析についてはわかりませんが、それはISO 8601です。 http://en.wikipedia.org/wiki/ISO_8601

24
smparkes

最初の答えよりもそれを解析する他の方法があります。それを解析するには:

(1)日付と時刻に関する情報を取得したい場合は、それをZonedDatetimeに解析することができます((Java 8以降)、またはDate(old)オブジェクト:

// ZonedDateTime's default format requires a zone ID(like [Australia/Sydney]) in the end.
// Here, we provide a format which can parse the string correctly.
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
ZonedDateTime zdt = ZonedDateTime.parse("2011-08-12T20:17:46.384Z", dtf);

または

// 'T' is a literal.
// 'X' is ISO Zone Offset[like +01, -08]; For UTC, it is interpreted as 'Z'(Zero) literal.
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX";

// since no built-in format, we provides pattern directly.
DateFormat df = new SimpleDateFormat(pattern);

Date myDate = df.parse("2011-08-12T20:17:46.384Z");

(2)日付と時刻を気にせず、単に情報をナノ秒単位の瞬間として扱う場合は、Instantを使用できます。

// The ISO format without zone ID is Instant's default.
// There is no need to pass any format.
Instant ins = Instant.parse("2011-08-12T20:17:46.384Z");
4
VeryLazyBoy

このテクニックは、Java.util.DateをUTC形式(または他の任意の形式)に変換したり、また戻したりします。

以下のようにクラスを定義します。

import Java.util.Date;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class UtcUtility {

public static DateTimeFormatter UTC = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZoneUTC();


public static Date parse(DateTimeFormatter dateTimeFormatter, String date) {
    return dateTimeFormatter.parseDateTime(date).toDate();
}

public static String format(DateTimeFormatter dateTimeFormatter, Date date) {
    return format(dateTimeFormatter, date.getTime());
}

private static String format(DateTimeFormatter dateTimeFormatter, long timeInMillis) {
    DateTime dateTime = new DateTime(timeInMillis);
    String formattedString = dateTimeFormatter.print(dateTime);
    return formattedString;
}

}

それからこのようにそれを使ってください:

Date date = format(UTC, "2020-04-19T00:30:07.000Z")

または

String date = parse(UTC, new Date())

必要に応じて他の日付フォーマットを定義することもできます(UTCだけではありません)。

0
Gapmeister66

次の例を使うことができます。

    String date = "2011-08-12T20:17:46.384Z";

    String inputPattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";

    String outputPattern = "yyyy-MM-dd HH:mm:ss";

    LocalDateTime inputDate = null;
    String outputDate = null;


    DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(inputPattern, Locale.ENGLISH);
    DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(outputPattern, Locale.ENGLISH);

    inputDate = LocalDateTime.parse(date, inputFormatter);
    outputDate = outputFormatter.format(inputDate);

    System.out.println("inputDate: " + inputDate);
    System.out.println("outputDate: " + outputDate);
0
Salih Kesepara