質問

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
.

Erwinは、誤った日付の違いに気づいているだけであると思われるコメントの中で、他の夏時間の節約日が25時間で起こる25時間の日数によって相殺されることが、日光の日の日が発生することです。修正されます。

溶液

日付処理にはより良いライブラリを使用してください。 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日ずつ整数が結果を切り捨てます。

ユークリッド(整数)分割の代わりに、フロート部門をやりながら、結果を丸めてみてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top