[#43996] ある日付の最終時刻の求め方 (秒単位) — SATOH Fumiyasu <fumiyas@...>

さとうふみやす @ OSS テクノロジです。

14 messages 2007/09/05
[#43998] Re: ある日付の最終時刻の求め方 (秒単位) — "GOTO Kentaro" <gotoken@...> 2007/09/05

07/09/05 に SATOH Fumiyasu<fumiyas@osstech.jp> さんは書きました:

[ruby-list:44006] Re: ある日付の最終時刻の求め方 (秒単位)

From: "NARUSE, Yui" <naruse@...>
Date: 2007-09-05 20:02:26 UTC
List: ruby-list #44006
成瀬です。

Urabe Shyouhei wrote:
> GOTO Kentaro wrote:
>> 07/09/05 に SATOH Fumiyasu<fumiyas@osstech.jp> さんは書きました:
>>> ある日時を持った Time オブジェクトからその日の
>>> 最終時間 (翌日の 0時ちょうど - 1秒) を求めたいのですが、
>> こんなのでどうでしょう。
>> % ruby -e 't = Time.now; p t,Time.local(59,59,23,*t.to_a[-7,7])'
> 
> 疑問に思ったものの調べかたが分からないので恥を忍んでお聞きするのです
> が、1日の最終秒というのは常に23時59分59秒なのでしょうか?
> 
> # 23時59分60秒になる瞬間が存在しうる地域がある気が

閏秒に関してはNICTのサイトが詳しいです。
http://jjy.nict.go.jp/QandA/reference/leapsec-addendum.html
# あとはWikipediaとか。

で、確かに時差+0の地域では23時59分60秒が存在しうるのですが、基本的には対
応するだけ無駄なのでやめたほうがいいように感じます。なぜなら、例えば自分
のマシン Time.local(2005,12,31, 0, 0, 0) などとした場合、そのオブジェク
トが指す時刻が本当はどの瞬間かわかりますか。

[ruby-list:44005] に示されているようにきちんと閏秒を考慮している環境なら
ば問題ありませんが(その環境で閉じているならね)、普通は考慮していないの
で、ntp等で現在の協定世界時とコンピュータのUTC時刻を合わせている場合、日
本時間2006年1月1日午前9時に1秒挿入されていますから、Time.local
(2005,12,31, 0, 0, 0) は多くの環境で実際には1秒後の時刻を指していること
になります。さらに Time.at(0) などとした日には33秒もずれていることになり
ます。

なお、実際問題として閏秒は多くのシステムでどう処理されるかというと、ntp
等で閏秒挿入後に時刻あわせをした際にずれが修正されるというあわせ方をする
ので、ほとんどのシステムでは60秒目をリアルタイムにカウントすることはない
でしょうし、過去についてもきちんと設定をしない限りずれっぱなしで放置され
ます。

結局のところ、ほとんどのケースでは気にするだけ無駄ということになります。
なお、気にする必要があるようなクリティカルな場合にどうするかですが、そう
いった場合は国際原子時を使うのが過去も未来も閏秒に悩まされなくてすむので
幸せになれるかと。

-- 
NARUSE, Yui  <naruse@airemix.com>
DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA

In This Thread