• ベストアンサー

日付の差を求める関数はないでしょうか。

日付の差を求める関数はないでしょうか。 SQLのDATEDIFFのような単純明快な関数があればいいなぁと思っています。 できれば、Perlの組み込み関数か、標準モジュールで・・・x_x

質問者が選んだベストアンサー

  • ベストアンサー
  • N60-BASIC
  • ベストアンサー率80% (17/21)
回答No.2

標準モジュールTime::Localに含まれるtimelocal()を使うと、自作サブルーチンで簡単に実現できます。 timelocal()は組み込み関数localtime()の逆関数です。年月日時分秒からエポック秒(1900/01/01 00:00:00 GMTからの秒数)を求めることができます。 use Time::Local; sub date_diff { my($year1, $mon1, $mday1, $year2, $mon2, $mday2) = @_; return((timelocal(0, 0, 0, $mday2, $mon2 - 1, $year2 - 1900) - timelocal(0, 0, 0, $mday1, $mon1 - 1, $year1 - 1900)) / (24 * 60 * 60)); } print date_diff(2000, 1, 1, 2010, 6, 24); # 2000/01/01から2010/06/24までの日数差

zyousuke
質問者

お礼

こんばんは なんと、私はここへ質問に来る前に、Time::Localの説明を読んでいたのでした。 それにも関わらず、私のおつむではサブルーチンをこしらえることが出来ませんでした、とほほ お教えいただいたサブルーチンを、ちこっと改造して、いい感じのサブルーチンが出来ました。 しかし、既に私のスクリプトは、そこそこ軽快に動いているので、このサブルーチンは、次のバージョンアップで入れることにしよう

その他の回答 (2)

回答No.3

よくわからないけれど、普通にPOSIX:difftimeじゃだめなのですか? POSIX:mktimeとあわせれば出来そうな予感がしますけど

zyousuke
質問者

お礼

こんばんは だめではありません。 知らないだけです^^; mktimeはNo.2 N60-BASICさんが教えてくれたtimelocalほとんど同じ機能ですね! したがってdifftimeは使わずにN60-BASICさんのサブルーチンをmktimeに置き換えるだけで行けますね! しかし今回は、より身近なtimelocalで組もうと思います。 今回というより次回かな・・・^^

  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.1

標準ではないですが、CPANモジュールならあります。 Date::Calc

zyousuke
質問者

お礼

こんばんは! やはり標準では、なさそうですね。 でも、無いことが分かってスッキリしました。 さて、悩んだあげく、私がとった方針は・・・ モジュールは入れずに、DBに接続してSQLでDATEDIFFを使うことにしました。 格好悪いですけど・・・

関連するQ&A

専門家に質問してみよう