2017-05-27 6 views
1

私は私のデバッグビューに以下のコードで何が起こっているかを把握することはできません。ミリ秒単位で時間を追加すると、間違った結果が表示されるのはなぜですか?

public void addTime(int day, long offsetMillis) { 

    long currentTime = mCalendar.getTimeInMillis(); 
    long newTime = currentTime + offsetMillis; 

    Date offsetDate = new Date(offsetMillis); 
    Date currentDate = new Date(currentTime); 
    Date newDate = new Date(newTime); 
    // ... 
} 

enter image description here

私は現在の時刻に追加する必要がミリ秒単位の時間を持っています。デバッグ状態を見ると、offsetDateが23:46に変換されていることが分かります。これは、追加したい時間が正しいことです。

currentDateは、現在の時刻です。これは、曜日00:00の開始時刻です。

newDateは現在の時刻にオフセットを加えたもので、13:46に変換されます。

これは間違いですが、ここではGMTの違いがありますが、ご覧のとおり、デバッグビューではGMTはすべて+10です。だから、私の人生は、Javaがやっていることを理解できません。どうすればこの問題を解決できますか?ミリ秒単位で時間を指定すると、指定した日付にどのように追加するのですか?

+1

「Date」ではなく「java.time」クラスを使用するのが理想的です。 –

答えて

1

すべての計算は正しいです。指定したミリ秒は、実際には13時間46分です。 timezoneはGMT + 10に設定されているため、offsetDateは23:46のみを表示します。

UNIXタイムスタンプは、1970年1月1日00:00 UTCからの経過時間をミリ秒単位でカウントします。この日付は、1970年1月1日10:00 UTC + 10に相当します。したがって、offsetDateに表示される時間は、それ自体10時間だけオフセットされます。

+0

偉大な回答と簡潔なありがとう。 – chaser

-2

タイムゾーンを指定する必要があります。例:

Date curr_date = new Date(System.currentTimeMillis("YOUR_TIMEZONE_HERE")); 
1

Answer by 3141が正しいとみなされます。

TL; DR

Instant.now().plusMillis(84_456_000L) // In UTC. 

java.time

この作業が面倒古い日時のクラスを取って代わるjava.timeクラスと簡単かつ明確になります。

Instantクラスは、nanoseconds(小数点以下9桁まで)の解像度を持つUTCのタイムライン上の瞬間を表します。

Instant now = Instant.now() ; 
Instant later = now.plusMillis(84_456_000L) ; 

また、時間帯をオブジェクトとして表すこともできます。

Duration d = Duration.ofMillis(84_456_000L) ; 

それとも...

Duration d = Duration.ofHours(23).plus(Duration.ofMinutes(46)) ; 

期間を適用します。

Instant later = now.plus(d) ; 
関連する問題