車輪。
こんばんは、まだ眠い
へなちょこ あにごんです。
いやぁ、車輪を再開発するのが好きです(笑)
作ったもんは、実際には仕事では使わないにしても、
一度、同じ内容だけど自分なりにスクリプト書くと、
よく中身がわかるからなのですが。
って、そうでもしないと、ちゃんと理解出来ないのです…読解力低いから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";
}