次のタイプの日付を解析したい:
2010-07-13T17:27:00.000Z
Javaで単純な日付フォーマッタを使用するにはどうすればよいですか? 使用する形式は何ですか?
次のタイプの日付を解析したい:
2010-07-13T17:27:00.000Z
Javaで単純な日付フォーマッタを使用するにはどうすればよいですか? 使用する形式は何ですか?
(実際にはフォーマット文字列を提供していないことに気付くかもしれません。これは「男に魚を教える」という答えです。特定のセクションで何を使用する必要があるかを具体的に理解するのに問題がある場合は、お気軽に詳細を説明し、何を試し、なぜうまくいかなかったのかを述べます. しかし、今のところ、特定のフォーマット文字列を試す段階には達していないようです. Javadocs はかなりよく書かれており、必要なものがすべて含まれています.ドキュメントから情報を抽出できることは、プログラマーにとって非常に重要なスキルであり、それを改善する機会を奪うつもりはありません。)
コードは次のコードのようになります。
日付文字列 " 2010-07-13T17:27:00.000Z
" には、この形式 " yyyy-MM-dd'T'hh:mm:ss.S'Z'
" を試すことができます。
日付文字列の「T」と「Z」は定数/区切り記号のみであると想定しています。
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestMain {
public static void main(String[] args) throws Exception{
String fromDateTime = "2010-12-01 00:01:23";
DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = null;
date = format.parse(fromDateTime);
//What ever you want to manipulate of this date object
//...
}
}
編集:適切なクラス、メソッド、コメントを追加して、完全なプログラムにします。@Andrzej Doyle からのコメントに感謝します。編集: 削除すると、デモ プログラムから IOException がスローされます。@BalusC に感謝します。編集:コメントを読み直して、@BalusCの完全な意味を理解してください:)
日時文字列は、 ISO 8601日時パターンに2010-07-13T17:27:00.000Z
準拠しています。この文字列では、 は日付と時刻の区切り記号であり、UTC (時間のタイムゾーン オフセット) を指定する Zulu を表します。この日時文字列を解析するために必要な形式は次のとおりです。T
Z
+00:00
yyyy-MM-dd'T'HH:mm:ss.SSSX
パターンの詳細については、ドキュメンテーション ページを参照してください。
従来の日時 API (java.util
日時型とその書式設定 API SimpleDateFormat
) は古く、エラーが発生しやすいことに注意してください。java.time
それらの使用を完全にやめて、最新の日時 API *に切り替えることをお勧めします。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.TimeZone;
public class Main {
public static void main(String args[]) throws ParseException {
String strDateTime = "2010-07-13T17:27:00.000Z";
Instant instant = Instant.parse(strDateTime);
ZonedDateTime zdt = ZonedDateTime.parse(strDateTime);
OffsetDateTime odt = OffsetDateTime.parse(strDateTime);
System.out.println(instant);
System.out.println(zdt);
System.out.println(odt);
// #################Using legacy API####################
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
Date date = sdf.parse(strDateTime);
// Default format
System.out.println(date);
// Custom format
sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
System.out.println(sdf.format(date));
// #####################################################
}
}
出力:
2010-07-13T17:27:00Z
2010-07-13T17:27Z
2010-07-13T17:27Z
Tue Jul 13 18:27:00 BST 2010
2010-07-13T17:27:00.000Z
DateTimeFormatter
現代の日付/時間のデフォルト パターンは ISO 8601 標準に従っており、ISO 8601 の日付/時間文字列を解析するために(SimpleDateFormat
現代の日付/時間 API の対応する) を明示的に必要としないことに注意してください。最新の日時 API の詳細については、Trail: Date Timeを参照してください。
ここで言及すべきもう 1 つの重要な点は、オブジェクトが、最新の日時型のjava.util.Date
ような実際の日時オブジェクトではないということです。むしろ、「エポック」(または UTC) として知られる標準ベース時刻からのミリ秒数を表します。のオブジェクトを出力すると、そのメソッドは、このミリ秒値から計算された JVM のタイムゾーンで日時を返します。異なるタイムゾーンで日時を出力する必要がある場合は、タイムゾーンを に設定し、そこからフォーマットされた文字列を取得する必要があります。January 1, 1970, 00:00:00 GMT
java.util.Date
toString
SimpleDateFormat
* 何らかの理由で、Java 6 または Java 7 に固執する必要がある場合は、ほとんどのjava.time機能を Java 6 および 7 にバックポートするThreeTen-Backportを使用できます。Androidプロジェクトと Android API で作業している場合レベルはまだ Java-8 に準拠していません。desugarで利用できる Java 8+ APIと Android プロジェクトで ThreeTenABP を使用する方法 を確認してください。