Javaでlong値(ミリ秒)を用いて時刻比較するときの注意点。
標準時(GMT)の1970年1月1日0時は数値では0。
日本の時差は9時間。
日本の1970年1月1日0時0分0秒(JST)は、
標準時(GMT)では、1969年12月31日15時0分0秒。
値はマイナス。-1000×60×60×9の値になる。
時間比較をするときは時差を考えて。
時差分だけ足すとマイナスされても正の値のみになる。
【前提】
時間比較をしようとして、日付部分をカットして時間のみのミリ秒数で比較しようとした。
(例えば、現在の時刻と営業時間の開始時刻と終了時刻を比較したい時など。)
※ちなみに日付部を切り落とす処理は、
上記のミリ秒を1日のミリ秒数(1000*60*60*24=86400000)として、
86400000で割った余りを取るようにしていた。
設定値も現在時間も日本時間(+9時間)で取得される想定だった。
どちらも日本時間なので比較自体時差による補正は不要だとおもっていた。
【やってみると】
0~8時59分だと、ミリ秒値を算出すると0以下の数値。マイナス値になっていた。
これはJavaでは日時型は標準時の1970/1/1 00:00:00からの経過ミリ秒数で保持されてることによるもので、
日本時間の1970/1/1の0~9時の場合、標準時変換すると1969/12/31になってしまい、
内部のミリ秒がマイナス値になっているためであった。
【どうすればいいか】
なので、この開始時間を比較する際に、時差を足して置くという処理が必要だった。
日本時間の1970/1/1 09:00:00が標準時の1970/1/1 00:00:00になるというわけ。
このままでは、日本の9時がミリ秒数では0で、8時が-3600000。0時は-32400000となってしまう。
なので、時差の9時間のミリ秒数(1000*60*60*9=32400000)をあらかじめ足しておけば
0時では0、8時では28800000、9時では32400000になるわけだ。
0時0分0秒を最小値の0。23時59分59.999秒を最大値の86399999として時間の比較をしたい。
たとえば、
営業開始時間 8:00
営業終了時間 17:00
現在時刻A 5:00 営業時間外
現在時刻B 10:00 営業時間内
現在時刻C 19:00 営業時間外
みたいに。
グレゴればいいじゃんという突っ込みは禁止です。