[Perl] 2/30 は何日なのか

こんにちは。
忘年会を控えているおじいさんです。でも、デスマーチ中なので、酒を飲んだ後に戻ってきて酔ったままプログラムかUTをせざる得ないようですが。それはそれで愉快。普段見つからないバグが見つかるに違いない。
それはともかく、Perlの日付計算の話です。

事の起こりは、同僚のM王子が
「PHPのmktimeに相当するものないですか~?」
と聞いてきた事でした。理由は、2/30と指定された時にはうるう年の時には3/1に、そうでない年は3/2に変換したい、という事でした。他にも31日判定とかイロイロあります。
一旦epoc秒に変換してから日付に変換する、という戦略をとりたかったわけですね。それで、mktimeでepoc秒へ変換したかったわけです。

PHPのmktime
 http://jp.php.net/mktime

「timelocalつかえば~」と言ったのですが、timelocalには一箇所致命的に動作が違う部分があります。
PHPのmktimeには2/30という値を入れるとepoc秒がちゃんと出てくれますが、Perlのは「a valid date」エラーが出力されるんですよ。
Date::Calcの関数は軒並みエラーしてくれちゃってます。たまには抜け道がほしいんだよぉ。

ちなみに、JavascriptはPHPと同じ反応をしてくれるようです(未確認)

Perlでやる方法

use Data::Dumper; # これは確認を楽にしたいんで使ってるだけですよーん
use Date::Calc qw(:all);

print Dumper(Add_Delta_Days(1999, 2, 1, 30-1));


Add_Delta_Daysは、日付の差分を計算してくれる優れものですんで、31日が何日か調べたければ、それを毎月1日からの差分として計算させれば出てきます。
これで、月末処理は楽になります。

なお、PHPのmktimeと違うのは、日付に00を指定すると、先月の最終日が取れます。
そこだけ注意しましょう。

参考
 http://search.cpan.org/~stbey/Date-Calc-5.4/Calc.pod
 http://www.ksknet.net/perl/datecalc.html
 http://isoya.at.webry.info/200701/article_3.html
 
 

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック