日付が何曜日、何日、年初から何日め、年初から何週めになるかを求める

#!/usr/bin/perl
use warnings;
use strict;
use utf8;
use Time::localtime;
use Date::Calc qw(Day_of_Week Week_Number Day_of_Year);

# Time::localtime のインスタンスを生成
my $tm    = localtime;
my $year  = $tm->year + 1900;
my $month = $tm->mon + 1;
my $day   = $tm->mday;

# 週初めから何日目かを取得する(月曜日が第1日目)
print Day_of_Week($year, $month, $day), "\n";
# 年初から第何週目かを取得する
print Week_Number($year, $month, $day), "\n";
# 年初から第何日目かを取得する
print Day_of_Year($year, $month, $day), "\n";

実行結果

% ./date_calc.pl
1
4
19

POSIX モジュール よりも Data::Calc の方が適切

次のページ「その年の第何週であるとか何日目であるかを知るには?」を参考にして動作させたが、返り値が期待していたものと違った。

#!/usr/bin/perl
use warnings;
use strict;
use utf8;
use POSIX qw/strftime/;

# 年初から第何日目かを取得する
my $day_of_year = strftime '%j', localtime;
print $day_of_year, "\n";

# 年初から第何週目かを取得する
my $week_of_year = strftime '%W', localtime;
print $week_of_year, "\n";

実行結果

% ./day_of_week.pl
019
03
  1. 日付が3桁で返される(2桁の日数の場合、3桁目を 0 で埋めている)
  2. 何週目なのか基準が意図していたものと異なる。
    POSIX モジュールはその年の初めての月曜日がある週を第 1 週と数えているようだ。
    ISO では週初めは月曜日になる。これはキリスト教の影響で、月曜日から土曜日にかけて神が世界を創り、日曜日を安息日にしたためのようだ。