Perl tips -- 日付を扱う

日付を扱う

  日付を扱うにはlocaltime() および timelocal() を使います。
9時間足したときの次の曜日をチェックするようなときは非常に便利です。
#!/usr/bin/perl
use Time::Local;
#
# 現在時間を表示する
@a = localtime(time);
$rss_date = sprintf("%04d-%02d-%02dT%02d:%02d:%02d",
    $a[5]+1900,$a[4]+1,$a[3],$a[2],$a[1],$a[0]);
print $rss_date . "+09:00\r\n";
#
# 時間を秒に変換する
$gmt0Time = timelocal(@a);
#
# 9時間引いて表示する
$gmt0Time += 9 * 60 * 60;
@a = localtime($gmt0Time);
$rss_date = sprintf("%04d-%02d-%02dT%02d:%02d:%02d",
    $a[5]+1900,$a[4]+1,$a[3],$a[2],$a[1],$a[0]);
print $rss_date . "+00:00\r\n";
#

カレンダーを作る

  blogっぽいwebページを作ろうとして 一番はまったのがカレンダーです。 曜日の取得にはZellarの公式 を使います。
#!/usr/bin/perl
#
$year = 2006;
$month = 12;

&printDateTime($year,$month);
exit(0);

# カレンダー作成
sub printDateTime {
    local($year,$month) = @_;
    local($i,$j,$dateTime,$flag);
    print '<table border="6"  bordercolor="#FEC977"' . "\r\n";
    print ' cellspacing="0" cellpadding="0" width="180">' . "\r\n";
    print ' <tr>' . "\r\n";
    print '  <td bgcolor="#F4F4F4" align="center" colspan="7">' . "\r\n";
    printf('   %04d 年 %02d 月 ' . "\r\n",$year,$month);
    print "  </td>\r\n";
    print ' </tr>' . "\r\n";
    print ' <tr>' . "\r\n";
    print '  <td><font color="#FF0000">日</font></td><td>月</td>' . "\r\n";
    print '  <td>火</td><td>水</td><td>木</td><td>金</td>' . "\r\n";
    print '  <td><font color="#0066FF">土</font></td>' . "\r\n";
    print ' </tr>' . "\r\n";
    $nowDay = 1 - &getWday($year,$month,1); #date=1
    $lastDay = &getLastDay($year,$month);
    for ($i = 0; $i < 6 ; $i++) {
	print " <tr>\r\n";
	for ($j = 0; $j < 7 ; $j++ , $nowDay++ ) {
	    if (($nowDay <= 0) || ($lastDay < $nowDay)) {
		print "  <td></td>\r\n";
		next;
	    }
            print "  <td>$nowDay</td>\r\n";
	}
	print " </tr>\r\n";
    }
    print '</table>' . "\r\n";
}

#Zellarの公式(曜日の取得)
#0が日曜日
sub getWday {
    local($year,$mon,$day) = @_;
    if ($mon == 1 or $mon == 2) {
        $year--;
        $mon += 12;
    }
    return ($year + int($year / 4) - int($year/100) + int($year / 400)
        + int((13 * $mon + 8) / 5) + $day) % 7;
}

#最終日の取得
sub getLastDay {
    local($year,$month) = @_;
    local(@lastMonth) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    local($lastDay) = $lastMonth[$month - 1];
    if ($month == 2 && (($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0)) {
        $lastDay++;
    }
    return $lastDay;
}
#
  結果はこんな感じになります。
2006 年 12 月
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31