\section{\module{calendar} ---
         一般的なカレンダーに関する関数群}

\declaremodule{standard}{calendar}
\modulesynopsis{\UNIX\ の \program{cal} プログラム相当の機能を含んだカレン
ダーに関する関数群}
\sectionauthor{Drew Csillag}{drew_csillag@geocities.com}

このモジュールは\UNIX{}の\program{cal}プログラムのようなカレンダー出力を
行い、それに加えてカレンダーに関する有益な関数群を提供します。標準ではこ
れらのカレンダーは（ヨーロッパの慣例に従って）月曜日を週の始まりとし、日
曜日を最後の日としています。
\function{setfirstweekday()}を用いることで、日曜日(6)や他の曜日を週の始
まりに設定することができます。日付を表す引数は整数値で与えます。

このモジュールで提供する関数とクラスのほとんどは \module{datetime} に依存しており、
過去も未来も現代のグレゴリオ暦を利用します。この方式はDershowitzとReingold
の書籍「Calendrical Calculations」にある proleptic Gregorian 暦に一致しており、
同書では全ての計算の基礎となる暦としています。\\
(訳注: proleptic Gregorian 暦とはグレゴリオ暦制定(1582年)以前についても
グレゴリオ暦で言い表す暦の方式のことで ISO 8601 などでも採用されています)

\begin{classdesc}{Calendar}{\optional{firstweekday}}
\class{Calendar} オブジェクトを作ります。\var{firstweekday} は整数で
週の始まりの曜日を指定するものです。\code{0} が月曜(デフォルト)、
\code{6} なら日曜です。

\class{Calendar} オブジェクトは整形されるカレンダーのデータを準備するために使える
いくつかのメソッドを提供しています。しかし整形機能そのものは提供していません。
それはサブクラスの仕事なのです。
\versionadded{2.5}
\end{classdesc}

\class{Calendar} インスタンスには以下のメソッドがあります。

\begin{methoddesc}{iterweekdays}{weekday}
曜日の数字を一週間分生成するイテレータを返します。
イテレータから得られる最初の数字は \method{firstweekday()}
が返す数字と同じになります。
% firstweekday は属性
% getfirstweekday() の謂いか
\end{methoddesc}

\begin{methoddesc}{itermonthdates}{year, month}
\var{year} 年 \var{month} 月に対するイテレータを返します。
このイテレータはその月の全ての日(\class{datetime.date} オブジェクトとして)
およびその前後の日で週に欠けが無いようにするのに必要な日を返します。
\end{methoddesc}

\begin{methoddesc}{itermonthdays2}{year, month}
\var{year} 年 \var{month} 月に対する \method{itermonthdates()} と同じような
イテレータを返します。生成されるのは日付の数字と曜日を表す数字のタプルです。
\end{methoddesc}

\begin{methoddesc}{itermonthdays}{year, month}
\var{year} 年 \var{month} 月に対する \method{itermonthdates()} と同じような
イテレータを返します。生成されるのは日付の数字だけです。
\end{methoddesc}

\begin{methoddesc}{monthdatescalendar}{year, month}
\var{year} 年 \var{month} 月の週のリストを返します。
週は全て七つの \class{datetime.date} オブジェクトからなるリストです。
\end{methoddesc}

\begin{methoddesc}{monthdays2calendar}{year, month}
\var{year} 年 \var{month} 月の週のリストを返します。
週は全て七つの日付の数字と曜日を表す数字のタプルからなるリストです。
\end{methoddesc}

\begin{methoddesc}{monthdayscalendar}{year, month}
\var{year} 年 \var{month} 月の週のリストを返します。
週は全て七つの日付の数字からなるリストです。
\end{methoddesc}

\begin{methoddesc}{yeardatescalendar}{year\optional{, width}}
指定された年のデータを整形に向く形で返します。返される値は月の並びのリストです。
月の並びは最大で \var{width} ヶ月(デフォルトは3ヶ月)分です。
各月は4ないし6週からなり、各週は1ないし7日からなります。
各日は \class{datetime.date} オブジェクトです。
\end{methoddesc}

\begin{methoddesc}{yeardays2calendar}{year\optional{, width}}
指定された年のデータを整形に向く形で返します (\method{yeardatescalendar()}
と同様です)。週のリストの中が日付の数字と曜日の数字のタプルになります。
月の範囲外の部分の日付はゼロです。
\end{methoddesc}

\begin{methoddesc}{yeardayscalendar}{year\optional{, width}}
指定された年のデータを整形に向く形で返します (\method{yeardatescalendar()}
と同様です)。週のリストの中が日付の数字になります。
月の範囲外の日付はゼロです。
\end{methoddesc}


\begin{classdesc}{TextCalendar}{\optional{firstweekday}}
このクラスはプレインテキストのカレンダーを生成するのに使えます。

\versionadded{2.5}
\end{classdesc}

\class{TextCalendar} インスタンスには以下のメソッドがあります。

\begin{methoddesc}{formatmonth}{theyear, themonth\optional{, w\optional{, l}}}
ひと月分のカレンダーを複数行の文字列で返します。\var{w}により日の列幅を変える
ことができ、それらはセンタリングされます。\var{l}により各週の表示される
行数を変えることができます。
\method{setfirstweekday()} メソッドでセットされた週の最初の曜日に依存します。
\end{methoddesc}

\begin{methoddesc}{prmonth}{theyear, themonth\optional{, w\optional{, l}}}
\method{formatmonth()} で返されるひと月分のカレンダーを出力します。
\end{methoddesc}

\begin{methoddesc}{formatyear}{theyear\optional{, w\optional{,
                               l\optional{, c\optional{, m}}}}}
\var{m}列からなる一年間のカレンダーを複数行の文字列で返します。
任意の引数 \var{w}, \var{l}, \var{c} はそれぞれ、日付列の表示幅、各週の行数及び
月と月の間のスペースの数を変更するためのものです。
\method{setfirstweekday()} メソッドでセットされた週の最初の曜日に依存します。
カレンダーを出力できる最初の年はプラットフォームに依存します。
\end{methoddesc}

\begin{methoddesc}{pryear}{theyear\optional{, w\optional{, l\optional{,
                           c\optional{, m}}}}}
\method{formatyear()} で返される一年間のカレンダーを出力します。
\end{methoddesc}


\begin{classdesc}{HTMLCalendar}{\optional{firstweekday}}
このクラスは HTML のカレンダーを生成するのに使えます。

\versionadded{2.5}
\end{classdesc}

\class{HTMLCalendar} インスタンスには以下のメソッドがあります。

\begin{methoddesc}{formatmonth}{theyear, themonth\optional{, withyear}}
ひと月分のカレンダーを HTML のテーブルとして返します。\var{withyear} が
真であればヘッダには年も含まれます。そうでなければ月の名前だけが使われます。
\end{methoddesc}

\begin{methoddesc}{formatyear}{theyear\optional{, width}}
一年分のカレンダーを HTML のテーブルとして返します。\var{width} の値
(デフォルトでは 3 です) は何ヶ月分を一行に収めるかを指定します。
\end{methoddesc}

\begin{methoddesc}{formatyearpage}{theyear\optional{,
                                   width\optional{, css\optional{, encoding}}}}
一年分のカレンダーを一つの完全な HTML ページとして返します。
\var{width} の値(デフォルトでは 3 です) は何ヶ月分を一行
に収めるかを指定します。\var{css} は使われるカスケーディング
スタイルシートの名前です。スタイルシートを使わないようにするために
\constant{None} を渡すこともできます。\var{encoding} には
出力に使うエンコーディングを指定します
(デフォルトではシステムデフォルトのエンコーディングです)。
\end{methoddesc}


\begin{classdesc}{LocaleTextCalendar}{\optional{firstweekday\optional{, locale}}}
この \class{TextCalendar} のサブクラスではコンストラクタにロケール名を渡す
ことができ、メソッドの返り値で月や曜日が指定されたロケールのものになります。
このロケールがエンコーディングを含む場合には、月や曜日の入った文字列は
ユニコードとして返されます。
\versionadded{2.5}
\end{classdesc}


\begin{classdesc}{LocaleHTMLCalendar}{\optional{firstweekday\optional{, locale}}}
この \class{HTMLCalendar} のサブクラスではコンストラクタにロケール名を渡す
ことができ、メソッドの返り値で月や曜日が指定されたロケールのものになります。
このロケールがエンコーディングを含む場合には、月や曜日の入った文字列は
ユニコードとして返されます。
\versionadded{2.5}
\end{classdesc}


単純なテキストのカレンダーに関して、このモジュールには以下のような関数が提供されています。

\begin{funcdesc}{setfirstweekday}{weekday}
 週の最初の曜日(\code{0}は月曜日, \code{6}は日曜日)を設定します。定数
 \constant{MONDAY}, \constant{TUESDAY},
 \constant{WEDNESDAY},\constant{THURSDAY}, \constant{FRIDAY},
 \constant{SATURDAY}及び\constant{SUNDAY} は便宜上提供されています。 
 例えば、日曜日を週の開始日に設定するとき:

\begin{verbatim}
import calendar
calendar.setfirstweekday(calendar.SUNDAY)
\end{verbatim}
\versionadded{2.0}
\end{funcdesc}

\begin{funcdesc}{firstweekday}{}
 現在設定されている週の最初の曜日を返します。
\versionadded{2.0}
\end{funcdesc}

\begin{funcdesc}{isleap}{year}
 \var{year}が閏年なら\constant{True}を、そうでなければ\constant{False}を返します。
\end{funcdesc}

\begin{funcdesc}{leapdays}{y1, y2}
 範囲(\var{y1}\ldots\var{y2})指定された期間の閏年の回数を返します。
 ここで\var{y1}や\var{y2}は年を表します。
 \versionchanged[Python 1.5.2では、この関数は世紀をまたがった範囲では動作
 しません。]{2.0}
\end{funcdesc}

\begin{funcdesc}{weekday}{year, month, day}
 \var{year}(\code{1970}--\ldots), \var{month} (\code{1}--\code{12}),
 \var{day}(\code{1}--\code{31})で与えられた日の曜日(\code{0}は月曜日)を
 返します。
\end{funcdesc}

\begin{funcdesc}{weekheader}{n}
短縮された曜日名を含むヘッダを返します。\var{n} は各曜日を何文字で表すかを
指定します。
\end{funcdesc}

\begin{funcdesc}{monthrange}{year, month}
 \var{year}と\var{month}で指定された月の一日の曜日と日数を返します。
\end{funcdesc}

\begin{funcdesc}{monthcalendar}{year, month}
 月のカレンダーを行列で返します。各行が週を表し、月の範囲外の日は0になり
 ます。
 それぞれの週は\function{setfirstweekday()}で設定をしていない限り月曜日か
 ら始まります。
\end{funcdesc}

\begin{funcdesc}{prmonth}{theyear, themonth\optional{, w\optional{, l}}}
 \function{month()}関数によって返される月のカレンダーを出力します。
\end{funcdesc}

\begin{funcdesc}{month}{theyear, themonth\optional{, w\optional{, l}}}
\class{TextCalendar} の \method{formatmonth} メソッドを利用して、
ひと月分のカレンダーを複数行の文字列で返します。
 \versionadded{2.0}
\end{funcdesc}

\begin{funcdesc}{prcal}{year\optional{, w\optional{, l\optional{c}}}}
 \function{calendar()}関数で返される一年間のカレンダーを出力します。
\end{funcdesc}

\begin{funcdesc}{calendar}{year\optional{, w\optional{, l\optional{c}}}}
\class{TextCalendar} の \method{formatyear} メソッドを利用して、
3列からなる一年間のカレンダーを複数行の文字列で返します。
 \versionadded{2.0}
\end{funcdesc}

\begin{funcdesc}{timegm}{tuple}
 関連はありませんが便利な関数で、\refmodule{time}モジュールの
 \function{gmtime()}関数の戻値のような時間のタプルを受け取り、 1970年を
 起点とし、POSIX規格のエンコードによる\UNIX{}のタイムスタンプに相当する
 値を返します。実際、\function{time.gmtime()}と\function{timegm()}は反対
 の動作をします。
 \versionadded{2.0}
\end{funcdesc}


\module{calendar} モジュールの以下のデータ属性を利用することができます:

\begin{datadesc}{day_name}
現在のロケールでの曜日を表す配列です。
\end{datadesc}

\begin{datadesc}{day_abbr}
現在のロケールでの短縮された曜日を表す配列です。
\end{datadesc}

\begin{datadesc}{month_name}
現在のロケールでの月の名を表す配列です。この配列は通常の約束事に従って、
1月を数字の 1 で表しますので、長さが 13 ある代わりに
\code{month_name[0]} が空文字列になります。
\end{datadesc}

\begin{datadesc}{month_abbr}
現在のロケールでの短縮された月の名を表す配列です。この配列は通常の約束事に従って、
1月を数字の 1 で表しますので、長さが 13 ある代わりに
\code{month_name[0]} が空文字列になります。
\end{datadesc}
 
\begin{seealso}
  \seemodule{datetime}{\refmodule{time} モジュールと似た機能を持った
                       日付と時間用のオブジェクト指向インタフェース。}
  \seemodule{time}{低レベルの時間に関連した関数群。}
\end{seealso}
