2013-09-22 12 views
5

何が問題なのですか?私は、1980年1月1日から1msを引いた場合、0:0:0とすると1979年を得たと仮定します。しかし、これは約500 + msを引く必要があります。私にヒントを与えてください。1msの減算により予期しない動作が発生する

val cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")) 
cal.set(1980, 0, 1, 0, 0, 0) 
val date = new Date 
date.setTime(cal.getTimeInMillis()) // <- 1980 Jan 01 0:0:0 
date.setTime(cal.getTimeInMillis() - 1) // <- 1980 Jan 01 0:0:0 too !!! 

更新されました。

解決策は何ミリ秒が設定されていないCalendar.set(year, month, day, hourOfDay, minute, second)

val cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")) 
cal.setTimeInMillis(0) 
cal.set(1980, 0, 1, 0, 0, 0) 
+0

ちょうど推測だが、おそらく社内のカレンダーは秒を切り上げるだろうか? – Aaron

+0

最初の 'setTime()'呼び出しの後に 'date'コンテンツを表示しようとします。おそらく年、月、日、時、分、秒は設定した値ですが、ミリ秒ではありません。 –

+0

少し混乱します。私はYoda Timeや別の第3部のライブラリを使いたくない。私は、年、月、日をミリ秒に変換し、その日の最後のミリ秒を取得する必要があります。私はこれに対して正しい解を見つけたいと思う。残念ながら、javadocはこのような状況については何も言いません。 – Ezhik

答えて

5

です。したがって、カレンダの実装ではミリ秒が「不明」に設定され、実際には指定された秒の中間点として扱われます。

500msを引くと、中間点をステップオーバーするだけです。 500msを追加すると同じことが起こるはずです。実際に500msを差し引くと、次の秒を見るために620msを追加する必要があります。

+0

そして1979年の最後のミリ秒を正しく得る方法は? – Ezhik

+0

が500msを引いたものは、必ずしも1979年の最後のミリ秒を与えるとは限りません。 –

+0

@Ezhikは、明示的に 'calendar.set(Calendar.MILLISECOND、0);'でミリ秒を設定します。そこから1ミリ秒を引くと、1979年に最後のミリ秒が直接得られます。 – jboi

関連する問題