2012-02-29 8 views
10

私は奇妙な問題に遭遇しました。ここではそれを説明したコードの抜粋です:Joda時間のDateTimeがjava.util.Dateに変わった奇妙な問題

DateTimeZone dtz = DateTimeZone.forOffsetHours(0); 

DateTime dt = new DateTime(dtz); 

System.out.println(dt); 
System.out.println(dt.toDate()); 

出力は次のとおりです。

2012-02-29T17:24:39.055Z 
Wed Feb 29 19:24:39 EET 2012 

私が置かUTC + 2だけど、このアクションはjava.util.Dateオブジェクトを作成することになっていますこれはUTC時間に初期化されます。私は何が欠けていますか?

+0

+1これは次のとおりです。

DateTime local = DateTime.now() Date localJDK = local.toDate() assert localJDK.getTime() == local.toInstant().getMillis() DateTime differentTimeZone = DateTime.now(DateTimeZone.forID('America/Chicago')) Date localJDK2 = differentTimeZone.toDate() assert differentTimeZone.toInstant().getMillis() == localJDK2.getTime() assert localJDK.getTime() == localJDK2.getTime() 

LocalDateTimeDateにそれを変更します変換なぜなら、java.util.DateのJavadocは、対応するsetterも、オフセットをとるコンストラクタもないにもかかわらず、 'getTimezoneOffset'というメソッドを示しているからです。 –

+0

@RayToalこれはSun devsによってまだ修正されていないのが奇妙です –

答えて

20

Dateは、すべての時間帯についてを知らない - それだけで(ジョダ時間のInstantタイプのような)時間に瞬間を表しています。これはUnixの時代から数ミリ秒です。 Date.toString()に電話すると、は常にがシステムローカルタイムゾーンを使用して、それを読み取り可能なテキスト形式に変換します。 いずれかjava.util.DateまたはそのtoString()行動、またはその両方の意味を超えるだけの期待障害 -

は、だからここに何も悪いことはありません。

(余談としては、自分自身を作成する上でDateTimeZone.UTCを好む。)

+0

ありがとうJon!しかし、dt.toDate()。getTime()を使用することは、私のコンピュータの現地時間です。指定したタイムゾーンに関連するミリ秒のjava.util.Dateオブジェクトを取得するにはどうすればよいですか? –

+0

@ MartinsAsenov:あなたが何を意味するかははっきりしない。私が言うように、 'java.util.Date'はUnixエポック(1970年1月1日深夜UTC)に相対的な* always *です。 –

+0

はい私はそれを知っています。私の誤解は、java.util.Dateがタイムゾーンに関連していたため、新しいDateTime(DateTimeZone.forOffsetHours(0))toDate()がUTC + 2の2時間遅れのミリ秒でDateオブジェクトを生成することを期待していました。私の意図は、何らかの形でユーザ関連の時間を保存することでしたが、今はこれがまったく必要ないと思います。 –

4

あなたが望む行動はこれです:

日jdkDate =新しいてSimpleDateFormat( "YYYY-MM-DD HH:MM:SS" を).parse(dt.toString( "yyyy-MM-dd HH:mm:ss"));

Jonと同様に、JDKの日付はタイムゾーンに依存しません。これが誰かを助けることを望みます。

9

JodaのDateTimeと一致するJDK Dateを取得するには、まずLocalDateTimeに変換してください。

としては、他の回答で説明し、タイムゾーンに応じて変化していないミリ秒単位の時間:

Date differentTimeZoneJDK = differentTimeZone.toLocalDateTime().toDate() 
assert localJDK.getTime() != differentTimeZoneJDK.getTime()