Smartphoneすぎゃーんメモ2014-01-31Time::Pieceでadd_monthsするときは月末の扱いに気をつけるPerl現在のTime::Pieceの最新版は、1.27。"\n";というコードを書いていて、1月31日に実行したら3が返ってきていてハマった。Time::Piece::add_monthsで月を操作した結果の日付がその月の月末を超えていると、正規化されて翌月の日付になってしまうようだ。Time::Piece->localtime->add_months(1)->ymd'2014-03-03ので、「翌月は何月か」を正確にとりたい場合は安易にadd_months(1)を使わずに、別の方法で取得する必要がある。"\n";こんなかんじで、「現在の月の最終日」をmonth_last_dayで取得できるので、それを使って月末の日付をstrptimeから生成、その1日後の日付から月数を取得する。DateTimeの場合はDateTime(現在の最新は1.06)はそのへん考慮して計算できるようになっていて、普通にaddすると同じような挙動だが、end_of_monthを指定することでその扱いを変えることができる。"preserve"の3種類を指定可能で、加算の場合は"wrap"が、減算の場合は"preserve"がデフォルトになっているらしい。"wrap"はTime::Pieceの挙動と同じで、月末を超えていた場合は翌月の日付にする。"preserve"の場合は月が変わることなく月末の日付になる。"limit"と"preserve"の違いは元々の日付が月末だったときに加減算後にも合わせて月末にするか否か、の挙動らしい。"preserve")->ymd'2014-03-31"preserve"だと、月末に加算した結果も月末になっている。まとめ...というようなことが全部podにちゃんと書いてあるから、よく読もう。