ある地域の時刻を取得するというのは結構厄介な問題だなぁという話

ある地域の時刻を取得するというのは結構厄介な問題だなぁと思う事案に出会ったのでメモを書いておきます。

お題)
昨日の日付を求めるプログラムを作成せよ。

前の日というのは今日が1日だと面倒なんですよね。30だったり31だったり29だったり28だったりするんで。そこでついつい以下のようなコードを書いてしまったりすると。

now = Time.new.local
now = now - 3600 * 24 #24hour
puts now.strftime("%Y-%m-%d"))

だけどこれは問題があるんですよね。具体的にはロンドンで(タイムゾーンは英国夏時間)、今が 2012-10-28 23:30:00 ならば誤動作をします。ちょっと書き直して次のように実行してみれば分かると思うのですが

ENV['TZ'] = 'Europe/London'

now = Time.local(2012,10,28,23,30,0)
puts now.strftime("%Y-%m-%d")
yesterday = now - 3600 * 24 #24hour
puts yesterday.strftime("%Y-%m-%d")

なんと24時間前も10月28日です。

なんでそうなっちゃうの?

結論から先に言うとサマータイムを勘案してないからです。日本みたいに常にUTCから9時間進んでいる国にいると実感がないけれど、イギリスでは2012年は10/28の深夜1時に夏時間から冬時間い切り替わっています。よって10/28だけは1日が25時間あるわけです。よって、24時間引いても同じ日になってしまう時間があるわけです。

これは面倒でもうるう年を考慮して1引くのが早いようで

 

Posted by issei

カテゴリ: 雑記

コメント一覧

24時間前が同じ日なら、もう1日前も求めるというのでは? うるう年の計算が省けると思うのですが?
あまゐり

あまゐりさん これとは逆に24時間前が二日前という日もあるんで(夏時間になる日は23時間しかない)そちらの対処も入れる必要もありますね。 二日前という判断をするにも結局のところ月が変わる可能性があるので、面倒なロジック結局いれることになるような気がします。
issei

時間の計算は時刻をUTCに変換してから行う、かなぁ。やぱ、忘れがちだけど。
ふたつき