私の日付は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
タグから来ています。
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()
を使用することもできます。
標準の ISO 8601 形式は入力文字列で使用されます。
Instant.parse ( "2011-08-12T20:17:46.384Z" )
このフォーマットは実用的な実用規格である ISO 8601 で定義されています。
T
name__は、日付部分と時刻部分を区切ります。末尾のZ
name__は、 _ utc _ を意味します(つまり、UTCからのオフセットが0時 - 分 - 秒)。 Z
name__は 発音された「Zulu」 です。
初期のバージョンのJavaにバンドルされている古い日時クラスは、設計が不十分で、混乱しやすく、面倒です。避けてください。
代わりに、Java 8以降に組み込まれている Java.time フレームワークを使用してください。 Java.timeクラスは、古い日付時刻クラスと非常に成功したJoda-Timeライブラリの両方に取って代わります。
Java.timeクラスは、日付/時刻値のテキスト表現を解析/生成するときに、デフォルトで ISO 8601 を使用します。
Instant
name__ クラスは、 _ utc _ のタイムライン上の瞬間を ナノ秒 の分解能で表します。そのクラスはフォーマットパターンを定義するために煩わされることなくあなたの入力文字列を直接解析することができます。
Instant instant = Instant.parse ( "2011-08-12T20:17:46.384Z" ) ;
Java.time フレームワークは、Java 8以降に組み込まれています。これらのクラスは、 Java.util.Date
、 Calendar
name__ 、& SimpleDateFormat
name__ などの厄介な古い レガシー 日時クラスに代わるものです。
Joda-Time プロジェクトは メンテナンスモード になり、 Java.time クラスへの移行を推奨します。
詳細については、 Oracleチュートリアル を参照してください。そして多くの例と説明についてはStack Overflowを検索してください。指定は JSR 310 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加クラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明するものです。 Interval
name__ 、 YearWeek
name__ 、 YearQuarter
name__ 、 more など、便利なクラスがいくつかあります。
Javaの構文解析についてはわかりませんが、それはISO 8601です。 http://en.wikipedia.org/wiki/ISO_8601
最初の答えよりもそれを解析する他の方法があります。それを解析するには:
(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");
このテクニックは、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だけではありません)。
次の例を使うことができます。
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);