- 締切済み
パッケージを利用した際の値に謎が!!
Perlのパッケージについて質問させてもらいます。 Time::Localを利用して1970年1月1日からの経過秒数を取得しようと考えています。 次の様な記述をして実験したのですが、私が想定している通りの動作になりません。 記述(テスト1) (以下からスクリプト開始) use Time::Local; $year=1970; $mon =1; $mday=1; $hours = 10; $min = 0; $sec = 0; $time = timelocal($sec, $min, $hours, $mday, $mon - 1, $year); print $time; (この1行上の行でスクリプト終了) この場合の$timeは、"3600"という答えを得ました。よって、"0"にするために次の様に スクリプトを書き変えて実験しました。 記述(テスト2) (以下からスクリプト開始) use Time::Local; $year=1970; $mon =1; $mday=1; $hours = 9; $min = 0; $sec = 0; $time = timelocal($sec, $min, $hours, $mday, $mon - 1, $year); print $time; (この1行上の行でスクリプト終了) この場合の$timeは、"-3600"という答えを得ました。 なんか変ですね。"0"の答えを得るためにはどうすればよいのでしょうか? よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- t-okura
- ベストアンサー率75% (253/335)
ほんとですね。ちなみに 1970.1.1 08:00:00 も -3600 になりました。 ソースをみると夏時間の処理によるもののようです。 CPAN に残っているソースで確かめると、最新の Time-Local-1.1901 でも 1970.1.1 09:00:00 は -3600 ですが、Time-Local-1.07 だと 1970.1.1 09:00:00 は 0 になります。 変更履歴では 1.13 2006-08-09 - Fixed a bug that occurred around the DST change for Europe/London (and probably other time zones with a positive UTC offset). If given, the hour immediately after the change (2:00 AM for Europe/London), then the returned epoch was 3600 seconds too large. Reported by Roger Picton. See RT #11662. と、1.13 で夏時間に関する変更が入っているので、この辺から うまくいかなくなったのではないかと思われます(CPAN に残って いないので確認できません)。
- superside0
- ベストアンサー率64% (461/711)
日本時間の1970/1/1 10:00 ということは、時差(+9時間)がありますから、GMTでいえば 1970/1/1 1:00となります。 これは、1970/1/1 0:00 から1時間後になりますから 経過秒でいうと、60秒×60分で、3600秒であってますよ。 なお、テストしましたが $hours = 9; とすれば、0になりましたよ。
お礼
t-okura 様 パッケージのバージョンによるデグレの可能性があるという事だけでも 分かって、安心しました。 CPANのことは良くわかりませんが、このサイトに行けば、作者に 対してデグレが発生していることを伝えることができるのですよね? 三根