10代と話して驚いたこと

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

A 回答 (3件)

標準モジュール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までの日数差
    • good
    • 0
この回答へのお礼

こんばんは

なんと、私はここへ質問に来る前に、Time::Localの説明を読んでいたのでした。
それにも関わらず、私のおつむではサブルーチンをこしらえることが出来ませんでした、とほほ

お教えいただいたサブルーチンを、ちこっと改造して、いい感じのサブルーチンが出来ました。
しかし、既に私のスクリプトは、そこそこ軽快に動いているので、このサブルーチンは、次のバージョンアップで入れることにしよう

お礼日時:2010/06/25 02:51

よくわからないけれど、普通にPOSIX:difftimeじゃだめなのですか?


POSIX:mktimeとあわせれば出来そうな予感がしますけど
    • good
    • 0
この回答へのお礼

こんばんは

だめではありません。
知らないだけです^^;

mktimeはNo.2 N60-BASICさんが教えてくれたtimelocalほとんど同じ機能ですね!
したがってdifftimeは使わずにN60-BASICさんのサブルーチンをmktimeに置き換えるだけで行けますね!

しかし今回は、より身近なtimelocalで組もうと思います。
今回というより次回かな・・・^^

お礼日時:2010/06/25 03:08

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


Date::Calc
    • good
    • 0
この回答へのお礼

こんばんは!
やはり標準では、なさそうですね。

でも、無いことが分かってスッキリしました。

さて、悩んだあげく、私がとった方針は・・・

モジュールは入れずに、DBに接続してSQLでDATEDIFFを使うことにしました。
格好悪いですけど・・・

お礼日時:2010/06/24 00:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報