4

私の問題はかなり単純に説明されています:

私がこれを行う場合:

public class Main {

public static void main(String[] args) throws Exception {
        Date d = new Date(0L );
        System.out.println(d);
}

}

次の出力が得られます:Thu Jan 01 01:00:00 CET 1970

ドキュメントによると、私は期待していた:Thu Jan 01 00:00:00 CET 1970

うまくいかなかったのですが...

編集:確かに、私はドキュメントを読むのが速すぎます。私は木1月1日00:00:00GMT1970を持っている必要があります

では、どうすればGMTの使用を強制し、すべての現地時間を無視できますか?

編集、解決策:

public static void main(String[] args) throws Exception {
    SimpleDateFormat sdf = new SimpleDateFormat("H:m:s:S");
SimpleTimeZone tz = new SimpleTimeZone(0,"ID");
sdf.setTimeZone(tz) ;
Date d = new Date(0L );
System.out.println( sdf.format(d));
}
4

4 に答える 4

6

エポックは、1970-1-1UTCの00:00:00として定義されます。CET はUTC+1であるため、時間は午前1時になります。

Date(long)コンストラクターを見ると、値がエポック( UTC)からのミリ秒数であることが期待されていることがわかります。

Dateオブジェクトを割り当て、「エポック」と呼ばれる標準の基準時刻、つまり1970年1月1日00:00:00GMTから指定されたミリ秒数を表すように初期化します。

ローカルタイムゾーンの代わりにGMTを強制したいという要望について:要するに、Dateインスタンスは常にGMTを使用します。GMTを使用するように出力文字列をフォーマットするだけの場合は、DateFormatクラス、具体的にはそのsetTimeZone()メソッドを使用します。

于 2010-03-12T17:31:30.407 に答える
3

これは、ロケール設定に関連している可能性があります。あなたがフランス系カナダ人ではなくフランス人であると仮定すると、タイムスタンプはタイムゾーンのないタイムスタンプとして扱われているように見え、Dateコンストラクターはこれを修正しようとし、日付に1時間を追加します。

これが文書化されていない動作であるかどうかにかかわらず、私はあなたに言うことができません。

編集:読み取りエラー:CET!= UTC:/

そうそう、ロケールのタイムゾーン。

再編集:完全かつ絶対的な明快さのために。

出力:Thu Jan 01 01:00:00 CET 1970

期待される出力:Thu Jan 01 00:00:00 CET 1970

実際の期待される出力:Thu Jan 01 00:00:00 GMT 1970(≡ThuJan 01 01:00:00 CET 1970)

于 2010-03-12T17:30:38.200 に答える
3

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
于 2013-12-22T07:52:14.027 に答える
1

CETは、エポックの定義に使用されるタイムゾーンであるGMTより1時間進んでいます。

于 2010-03-12T17:30:20.523 に答える