frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

車輪。

こんばんは、まだ眠い

へなちょこ あにごんです。

いやぁ、車輪を再開発するのが好きです(笑)

作ったもんは、実際には仕事では使わないにしても、

一度、同じ内容だけど自分なりにスクリプト書くと、

よく中身がわかるからなのですが。

って、そうでもしないと、ちゃんと理解出来ないのです…読解力低いからorz

かくして、「訳わからん」って思った事は何でも

一度自分の言葉に置き換えて書き直して保存しとくと、書き直す時に復習になるし、

自分の言葉だから、後にそれを見た時、理解しやすいし、

個人的には、一石二鳥で大好き。

って、どうでもいいけど、キーボードが壊れてきて

Enterキーが押しっぱなしになりやすいなぁ…orz

てなこったで、

車輪「DateUtil」遊びの続きを小一時間してた時のメモ(笑)

あー、それにしたって、引き数多すぎで、これ嫌い。

そういう時は、本当はVO・DTOが必要よね、やっぱり…。

・DateUtil.pm

package DateUtil;

use Exporter;

use Readonly;

use Time::Local;

@ISA = qw(Exporter);

@EXPORT_OK = qw(makeTime getLastDay isLeapYear);

our (@ISA, @EXPORT_OK);

Readonly my @LAST_DAY => (qw(0 31 28 31 30 31 30 31 31 30 31 30 31));

my $FIRST_MONTH = 1;

my $TARGET_MONTH_BY_LEAPYEAR = 2;

my $LAST_MONTH = 12;

my $TRUE = 1;

my $FALSE = 0;

sub new {

my $me = shift;

my $param = {

};

bless $param, $me;

}

sub makeTime {

my $hour = shift;

my $minute = shift;

my $second = shift;

my $month = shift;

my $day = shift;

my $year = shift;

my $lastDay = &getLastDay($year, $month);

if ($day > $lastDay) {

return &_mktimeForNextMonth($hour, $minute, $second,

$month, $day, $year, $lastDay);

}

if ($day < 1) {

return &_mktimeForLastMonth($hour, $minute, $second,

$month, $day, $year, $lastDay);

}

return timelocal($second, $minute, $hour, $day, $month - 1, $year - 1900);

}

sub getLastDay {

my $year = shift;

my $month = shift;

return $LAST_DAY[$month] if $month != $TARGET_MONTH_BY_LEAPYEAR;

# 2月の場合

my $isLeapYearFlag = &isLeapYear($year);

my $resultLastDay = $LAST_DAY[$month];

$resultLastDay++ if $isLeapYearFlag;

return $resultLastDay;

}

# この判定は、perl メモ から拝借

# http://www.din.or.jp/~ohzaki/perl.htm#Date2WDay

sub isLeapYear {

my $year = shift;

return $TRUE if $year % 400 == 0; # 400で割れるので閏年

return $FALSE if $year % 100 == 0; # 100で割れるので閏年ではない

return $TRUE if $year % 4 == 0;

return $FALSE;

}

sub _mktimeForNextMonth {

my $hour = shift;

my $minute = shift;

my $second = shift;

my $month = shift;

my $day = shift;

my $year = shift;

my $lastDay = shift;

$day -= $lastDay;

$month++;

if ($month > $LAST_MONTH) {

$month = $FIRST_MONTH;

$year++;

}

return &makeTime($hour, $minute, $second,

$month, $day, $year);

}

sub _mktimeForLastMonth {

my $hour = shift;

my $minute = shift;

my $second = shift;

my $month = shift;

my $day = shift;

my $year = shift;

my $lastDay = shift;

$month--;

if ($month < $FIRST_MONTH) {

$month = $LAST_MONTH;

$year--;

}

$lastDay = &getLastDay($year, $month);

$day = $lastDay + $day;

return &makeTime($hour, $minute, $second,

$month, $day, $year);

}

1;

・test.pl

#!/usr/bin/perl -w

use strict;

use lib '/home/anigon/date';

use DateUtil qw(makeTime);

my $resultTime = &makeTime(23, 38, 6, 3, 0, 2000)."\n";

&showDate($resultTime);

$resultTime = &makeTime(23, 38, 6, 4, -31, 2000)."\n";

&showDate($resultTime);

exit;

sub showDate {

my $resultTime = shift;

my @resultDate = localtime($resultTime);

$resultDate[4]++;

$resultDate[5]+=1900;

print join "/", @resultDate;

print "\n";

}