1976年3月28日から3月29日の間にjava.util.GregorianCalendarと何が起こったの?
-
12-12-2019 - |
質問
GregorianCalendarを使用しようとしている、私は特定の日から日数を計算しながら特異点に立ち往生しました。 Scalaインタプリタで、私は入力しました:
scala>import java.util.GregorianCalendar
scala>import java.util.Calendar
scala>val dateToday = new GregorianCalendar(2012,Calendar.MAY,22).getTimeInMillis()
dateToday: Long = 1337637600000
scala>val days1 = (dateToday - (new GregorianCalendar(1976,Calendar.MARCH,28).getTimeInMillis())) / (1000*3600*24)
days1: Long = 13203
scala>val days2 = (dateToday - (new GregorianCalendar(1976,Calendar.MARCH,29).getTimeInMillis())) / (1000*3600*24)
days2: Long = 13203
.
1976年の事実がうるい事項であるかどうかわかりませんが、DAYS1とDAYS2は1で区切られているべきです。これは1970年以来の歴史の唯一の瞬間です。
何が起こっているのか知りたいのですが、以前に言及した2つの日付の違いを計算し、それは私に23時間の違いだけを与えます!その日に何が起こったのですか?ウィキペディアはどうやらそれについて何も言いません。
とさらに重要な、特定の日付から実数を計算する方法は?
解決
フロート部門のオプションが利用できない場合、私が考えることができる最善の答えは、2日間の違いを計算しながら1時間(1000 * 3600)を追加することです:
scala> (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 28).getTimeInMillis()) + 1000*3600) / (1000 * 3600 * 24)
days1: Long = 13204
scala> (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 29).getTimeInMillis()) + 1000*3600) / (1000 * 3600 * 24)
days1: Long = 13203
.
あなたがもううるい時間に苦しんでいないので、あらゆる日に働くべきです。
他のヒント
問題
夏時間はわずか23時間です。
1976年3月28日は、毎日の普通預金の日でした。最小パリ。その日の午前1時から午前2時の間の時間は単に存在しませんでした。私のコンピュータにはそれを正しく入手しているのでロケールの問題でなければなりません:
scala> val days1 = (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 28).getTimeInMillis())) / (1000 * 3600 * 24)
days1: Long = 13203
scala> val days2 = (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 29).getTimeInMillis())) / (1000 * 3600 * 24)
days2: Long = 13202
.
私はパリや他のどこにもその日に変化した場所にいません。時間は1976年4月25日に変わりました。だから私はその日の「スキップされた日」の動作を手に入れます:
scala> val days3 = (dateToday - (new GregorianCalendar(1976, Calendar.APRIL, 25).getTimeInMillis())) / (1000 * 3600 * 24)
days3: Long = 13175
scala> val days4 = (dateToday - (new GregorianCalendar(1976, Calendar.APRIL, 26).getTimeInMillis())) / (1000 * 3600 * 24)
days4: Long = 13175
.
溶液
日付処理にはより良いライブラリを使用してください。 joda-time ライブラリー(より良い日付/時刻フレームワーク全体として):
import org.joda.time.Days
import org.joda.time.DateTimeConstants
import org.joda.time.DateMidnight
val d1 = new DateMidnight(1976, DateTimeConstants.APRIL, 25)
val d2 = new DateMidnight(1976, DateTimeConstants.APRIL, 26)
val x = Days.daysBetween(d1, d2).getDays()
println(x) // 1
. DHG私が考えたものを指摘しました:この日は「夏時間」の日です。 この日はわずか23hの長さで、ユークリッド師団は1日に0.
実際には、GregorianCalendarオブジェクトを使用することは、日付をミリ秒としてのみ使用しているため、1日ずつ整数が結果を切り捨てます。
ユークリッド(整数)分割の代わりに、フロート部門をやりながら、結果を丸めてみてください。