プロが教えるわが家の防犯対策術!

Date::Calcのレシピに掲載されていた「現在が第何週にあるかを計算するには」をチェックしたのですが、今日4/9に以下の計算をさせると$weekが「3」となり「第三週」になってしまいます。

use Date::Calc qw(:all);

($year,$month,$day,$hour,$min,$sec)=Today_and_Now();#現在日時
$dow = Day_of_Week($year,$month,$day);#現在の曜日
$week = int(($day+Day_of_Week($year,$month,1)-2)/7)+1;#現在は当月の第何週か

print "Content-type: text/html\n\n";
print "<html><head></head><body>";
print "today:$year,$month,$day\n";
print "week:$week\n";
print "</body></html>";
exit;

以下のように日時を数値で入れても同じですが、これは掲載されているレシピのミスなのでしょうか?
それとも、Date::Calcが月曜日を「1」として計算するから、第三週となってしまうのでしょうか?、これを修正するにはどのようにしたら良いのでしょうか?
$week = int((9+Day_of_Week(2007,4,1)-2)/7)+1;

Date::Calc:日本語訳
http://perldoc.jp/docs/modules/Date-Calc-5.3/Cal …

A 回答 (3件)

ついさっき原文を見てたところなので参考までに。



* "$dow = Day_of_Week($year,$month,$day);"

This function returns the number of the day of week of the given date.

The function returns "1" for Monday, "2" for Tuesday and so on until
"7" for Sunday.

Note that in the Hebrew calendar (on which the Christian calendar is
based), the week starts with Sunday and ends with the Sabbath or
Saturday (where according to the Genesis (as described in the Bible)
the Lord rested from creating the world).

In medieval times, Catholic Popes have decreed the Sunday to be the
official day of rest, in order to dissociate the Christian from the
Hebrew belief.

Nowadays, the Sunday AND the Saturday are commonly considered (and
used as) days of rest, usually referred to as the "week-end".

Consistent with this practice, current norms and standards (such as
ISO/R 2015-1971, DIN 1355 and ISO 8601) define the Monday as the first
day of the week.


元々がキリスト教の習慣からというのはよいとして、
ISOという国際的な規格でも月曜始まりが基準のようです。

ISO 8601 - Wikipedia
http://ja.wikipedia.org/wiki/ISO_8601

年と週と曜日

YYYY-Www-D と表記する。ww は年内の暦週の番号で、年の第1週は 01、最終週は 52 または 53 となる。第1週は事実上1月4日を含む週に等しい。D は曜日を表し、月曜日が 1、日曜日は 7 である。
    • good
    • 0
この回答へのお礼

ありがとうございます。

~このシステムは「月火水木金土日』というISO規格で運用しています。~
等と注釈つけてしまうのもアリ?なんでしょうかね。

お礼日時:2007/04/09 16:32

>原文チェックしていないのですがレシピのカレンダーは日曜日頭となっていました。



いえ、レシピ(訳文)は月曜頭になっています。
>5.) 現在が、第何週目にあるかを計算するにはどうしたらいいですか?
>例:
>         1998年4月
>    Mon Tue Wed Thu Fri Sat Sun

>ということは、今回のもののように他にも日本式に修正してやらないと行けないものがあるのでしょうか。
その通りです。「週の番号を返す」とか「同じ週の週頭を返す」とか「1年の週の数を返す」など、括りが「週」になっている関数や例文は、すべて「月曜始まりになっている」と考えて下さい。
    • good
    • 0
この回答へのお礼

レシピのカレンダーの件,申し訳ないです。単なる私のとんちんかんな記載ミスです。

Date::Calcも利用場面によっては気をつけないといけないようですね。
ありがとうございました。

お礼日時:2007/04/09 16:28

キリスト教圏の欧米では、1週間は「月火水木金土日」です。



旧約聖書には「神は月~土の6日間で世界を創り、7日目の日曜日を安息日とした」と書いてありますからね。

なので「Day_of_Weekは、月曜日を1、火曜日を2…日曜日を7で返す」と言う仕様になっています。

欧米式カレンダーでは、4月は
月 火 水 木 金 土 日
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
って感じです。

>今日4/9に以下の計算をさせると$weekが「3」となり「第三週」になってしまいます。
そうなるのが(欧米式で言えば)正しいです。欧米式で言えば4/9は第三週の週頭ですから。

日本式に、1週間を「日月火水木金土」にして考えるには、Day_of_Weekの部分を「日曜日を1、月曜日を2、火曜日を3…土曜日を7」になるように書き換えます。

$week = int(($day+Day_of_Week($year,$month,1)-2)/7)+1;#現在は当月の第何週か

$week = int(($day+(Day_of_Week($year,$month,1)%7)-1)/7)+1;#現在は日本式で当月の第何週か
に変えて下さい。

この回答への補足

原文チェックしていないのですがレシピのカレンダーは日曜日頭となっていました。月曜日=1は認識しています。
また、以下のように修正しましたら正常に計算されるようになりました。
$week = int(($day+Day_of_Week($year,$month,$day)-2)/7)+1;

が、これでOKなのかなと

補足日時:2007/04/09 13:23
    • good
    • 0
この回答へのお礼

補足に入れた修正案は日曜日で計算させるとだめでした。
教えて頂いた方法できちんと計算されるようになりました。
ありがとうございました。

ということは、今回のもののように他にも日本式に修正してやらないと行けないものがあるのでしょうか。

お礼日時:2007/04/09 14:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!