tl:dr
Instant.EPOCH
.toString()
1970-01-01T00:00:00Z
Date::toString
嘘
java.util.Date/Calendarクラスの使用を避ける多くの理由の1つを学びました。Date
インスタンスにはタイムゾーン情報がありませんが、そのtoString
メソッドは表示用の文字列をレンダリングするときにデフォルトのタイムゾーンを使用します。日付にはタイムゾーンがあることを意味しますが、実際にはないため、混乱します。
避けるDate
/Calendar
Date / Calendarの代わりに、Joda -TimeまたはJSR310の新しいJava8クラスjava.time。*を使用する必要があります。
java.time
このクラスを、UTCのタイムライン上の瞬間にInstant
相当するものとして使用します。Date
Instant.now()
エポック参照日には、定数を使用します。
Instant.EPOCH.toString()
1970-01-01T00:00:00Z
「すべての時間を無視する」とは、時刻のない日付のみの値が本当に必要な場合は、LocalDate
クラスを使用します。
LocalDate.ofEpochDay( 0L )
1970-01-01
ジョーダ-時間の例
更新:Joda-Timeプロジェクトは現在メンテナンスモードにあり、チームはjava.timeクラスへの移行をアドバイスしています。
Joda-Timeでは、DateTimeインスタンスは実際に独自のタイムゾーンを認識しています。必要に応じて、フォーマッタを使用して他のタイムゾーンで文字列出力を作成できます。
これがUnix時間 Epochを目指しているが、Joda-Time2.3を使用しているコードです。
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;
DateTimeZone timeZone_Paris = DateTimeZone.forID( "Europe/Paris" );
DateTime epochParis = new DateTime( 0L, timeZone_Paris );
DateTime epochUtc = new DateTime( 0L, DateTimeZone.UTC );
コンソールにダンプ…</p>
System.out.println( "epochParis: " + epochParis );
System.out.println( "epochUtc: " + epochUtc );
実行時…</p>
epochParis: 1970-01-01T01:00:00.000+01:00
epochUtc: 1970-01-01T00:00:00.000Z
UTC/GMTに変換
では、どうすればGMTの使用を強制し、すべての現地時間を無視できますか?
UTC / GMT(タイムゾーンオフセットなし)を使用するには、次のいずれかを行います。
- DateTimeを異なるタイムゾーンの別のインスタンスに変換します
(Joda-Timeはスレッドセーフのために物事を不変にするため、実際には変換せず、古いインスタンスに基づいて新しいインスタンスを作成します)。
- フォーマッタを使用して、指定したタイムゾーンで表示される文字列を作成します。
// To use UTC/GMT instead of local time zone, create new instance of DateTime.
DateTime nowInParis = new DateTime( timeZone_Paris );
DateTime nowInUtcGmt = nowInParis.toDateTime( DateTimeZone.UTC );
コンソールにダンプ…</p>
System.out.println( "nowInParis: " + nowInParis );
System.out.println( "nowInUtcGmt: " + nowInUtcGmt );
実行時…</p>
nowInParis: 2013-12-22T08:40:01.443+01:00
nowInUtcGmt: 2013-12-22T07:40:01.443Z