師匠の散歩

きままにPerlでも

getTimeLocal2

暦 Calender.pm を構築する / エポック秒を理解し、独自の計算で内部関数を一切使わずに関数化する/ getTimeLocal2.cgi

内部関数を一切使わずにエポック秒を求める。うるう年の定義をもとに、グレゴリウス西暦1年1月1日からの日数を求め、西暦1年1月1日のエポック数を減算することで、解を求める。減算する数値を調整することで、タイムゾーンの影響を付加させている。

目標とする解
getTimeLocal2(0,0,0,1,0,-1890) = 62135629200 = 62135596800 + 32400
getTimeLocal2(0,0,0,1,0,70) = timelocal(0,0,0,1,0,70) => - 60*60*9 = - 32400
年月日を入力してください。10年間同じ日付けでのエポック秒を求めます。


ボタンを押すと実行します

結果

本サーバー(FreeBSD Perl 5.10.1)での本ルーチンの値とtimelocalで求めた値は、1962から2038までが同じ値にった(2011/2/25)。扱える桁数が影響する2037年問題もあるため、数式どおりの解を返すのが正しい関数なのかという議論はここではしないが、少なくとも、1962〜2037ごろまで本ルーチンは正しいと謙虚に言っておく。

ちなみに、WindowsXP Active-Perl 5.12.2 では、両者が一致する範囲が広くなった。 今後、Perlのバージョンを最新とすることで、UNIXサーバーにおいても 1962問題や2038年問題を解決できる可能性がある。 まあ、Perlのバージョンをこまめに更新するサイト管理者は少ないと思うので、今運営されている日記ページのほとんどで、2038年には日時が正確に表されない可能性がある、ということを利用者は認識すべきである。

スクリプト(抜粋)

getTimeLocal2.cgi // Topに戻る // indexに戻る
Copyright(C) 2009-2021 Grandmaster Last up : 2020/09/18