2017-11-14 3 views
-1

私はESTタイムゾーンで自分のコードを実行しています。Javaインスタント・トゥデー - 異なるタイムゾーンで

Instant.now()をコードに使用すると、UTCで時刻が返されます。

しかし、私はインスタントので、私はESTでこれを実行している、以来

Date.from(Instant.now()) 

を使用して日付にこれを変換しようとしていない日としてDBからデータを取得するメソッドをテストしようとしています、このDateを提供します私はESTで時間を過ごす。

実際のコード、

final Optional<Date> dbTime = dbService.getUpdatedTime(); 
    final Instant lastInstant = dbTime.orElseGet(() -> Date.from(Instant.now())).toInstant(); 

テストコード、ここ

final Date dbTime = Date.from(Instant.now().minusSeconds(36000)); 
when(dbService.getUpdatedTime().thenReturn(Optional.of(dbTime)); 

は、dbTimeは、EST時間に変換されます。私はそれを設定することによってUTC時間を返すようにすることができますTimeZone.setDefault(TimeZone.getTimeZone("UTC"));

他にも良い方法がありますか?これは、メインアプリケーションクラスにTimeZone.setDefault(TimeZone.getTimeZone("UTC"));を設定しても問題ありませんので、常にUTCとして扱われますか?

+0

[タイムゾーン変換](https://stackoverflow.com/questions/6567923/timezone-conversion)の可能な複製 – pvg

+2

「日付」にはタイムゾーンがありません。それはただの瞬間です。 https://codeblog.jonskeet.uk/2017/04/23/all-about-java-util-date/ –

+1

を参照してください。@JonSkeetが正しいです。だからあなたは基本的に問題がない。あなたがそれを持っていたと信じさせたのは、単に 'Date.toString()'です。 –

答えて

1

最新のJavaの日付と時刻APIを使用できるので、可能な限り使用して、古くなったDateクラスの使用を最小限に抑えることをお勧めします。 getUpdatedTime()Optional<Date>ではなくOptional<Instant>に変更することができれば最善の方法です(現代のJDBCドライバはデータベースからdatetimeを直接Instantとして与えることができます)。 InstantがUTCで印刷されるため、これですべての問題と質問が一掃されます。

この回答では、私はあなたがそれを行うことができない、またはまだやりたくないと仮定しています。あなたはまだ近くに近づくことができます:

final Optional<Instant> dbTime = dbService.getUpdatedTime().map(Date::toInstant); 
    final Instant lastReconInstant = dbTime.orElseGet(Instant::now); 

TimeZone.setDefault()を避けてください。 JVMにはグローバルタイムゾーンの設定が1つしかないため、同じJVMで実行されているプログラムや他のプログラムの動作が意図せず変更される可能性があります。

詳細をあなたのスタブコードで明示することをお勧めします。 2つのオプションがあります。

final Date dbTime = Date.from(Instant.now().minus(10, ChronoUnit.HOURS)); 

    final Date dbTime = Date.from(Instant.now().minus(Duration.ofHours(10))); 

このすべては、最初は問題がなかったようです。 A Dateにタイムゾーンはありません。そのtoStringメソッドは、JVMのデフォルトのタイムゾーンを取得し、日付と時刻のレンダリングに使用します。これは多くをだましてしまい、できるだけそのクラスを避ける理由の1つに過ぎません。

関連する問題