Calendar

暦法の抽象基底クラス

暦法定義用のクラスは、このクラスのサブクラスとします。
サブクラスでは以下のメソッドを再定義してください。
  _date_to_sd, _sd_to_date, _qualify
  _time_to_sd, _sd_to_time (時刻制度まで変える場合)

本クラス自体の機能は、以下の2点です。
  1. 時刻の処理を行い、サブクラスを日付の処理に専念させる。
  2. 暦の外部表現(運用表現)と内部表現(暦法自体)との変換を行う。

スーパークラス:

条件付きでインクルードするモジュール:

クラス メソッド:

Calendar.get(key [, all=false])
暦法検索キーにヒットする Calendar オブジェクト(のリスト)を返します。
  key  暦法(Calendar )検索キー
  all  配列を返すか、ヒット結果を返すかの指定
Calendar.select(date)
日時を表す配列から、使用する Calendar オブジェクト等を抽出して返します。
日付の整合性をチェックします。
(副作用) 配列の先頭要素が暦法指定のみのための要素の場合これを削除します。
(戻り値) [使用暦法, 計算用暦法, 地方時通日]
  date 日時を表す配列
Calendar.new([quality={}])
Calendar オブジェクトを生成して返します。
  quality  暦法の性質定義

パブリック インスタンス メソッド:

Calendar#month_name(id)
Calendar#day_name(id)
Calendar#month_name_abbr(id)
Calendar#day_name_abbr(id)
id を月の名前,七曜の名前およびその省略形に変換して返します。
  id  月の場合は月の順序数または配列[順序数,閏]
      七曜の場合は数値(0:日曜, .., 6:土曜)
Calendar#all_month_names
月の名前をすべて'|'で結合した文字列を返します。
Calendar#all_day_names
七曜の名前をすべて'|'で結合した文字列を返します。
Calendar#month_id(name)
月の名前またはその省略形を id に変換して返します。
閏月のない暦法の場合 id は月の順序数、
閏月のある暦法の場合 id は配列[順序数,閏・白分・黒分情報]です。
  name 月の名前またはその省略形
      (ただし name に id を与えると、その id をそのまま返します)
Calendar#day_id(name)
七曜の名前またはその省略形を id に変換して返します。
  name 七曜の名前またはその省略形
      (ただし name に id を与えると、その id をそのまま返します)
Calendar#exist?(*date)
日時表現に対応する日付が存在していれば、その地方時通日を返します。
日時表現に対応する日付が存在していなければ、nil を返します。
  date 日付表現を格納した配列
Calendar#date_to_sd(*date)
日時を表す配列を地方時通日に変換して返します。
  date 日時を表す配列  年 [,月 [,日 [,時 [,分 [,秒 [,秒の小数]]]]]]
Calendar#sd_to_date(sd [, n=1 [, off=[0,1]]])
地方時通日を日時を表す表現の組に変換して返します。
  sd  地方時通日
  n   n 番目の日時を表す表現の組に変換するかを指定
  off 紀年法の補正情報([紀元[,方向])
Calendar#sd_to_s(sd [, n=1 [, off=[0,1]]])
地方時通日をISO8601拡張文字列に変換して返します。
  sd  地方時通日
  n   n 番目の日時を表す表現の組に変換するかを指定
  off 紀年法の補正情報([紀元[,方向])
Calendar#elements_to_s(elements)
暦要素の配列を文字列の配列に変換して返します。
  elements  年から秒の小数までの暦要素
Calendar#new_year(year)
運用上の年の始めの地方時正午通日を返します。
  year 暦法アルゴリズムが与える年の順序数
Calendar#new_day(sdn)
運用上の日の始めの地方時通日を返します。
  sdn  地方時正午通日
Calendar#round_day(sd)
地方時通日を当該暦法での同日の地方時正午通日に丸めて返します。
  sd  地方時通日
Calendar#shift_sd(sd, period)
sd から period で指定された期間だけ隔たった地方時通日を返します。
  period ISO8601期間文字列 
Calendar#shift_sd_y(sd, n)
sd で指定した日の n 年後の地方時通日を返します。
  sd  地方時通日 
  n   年数 
Calendar#shift_sd_m(sd, n)
sd で指定した日の n ヶ月後の地方時通日を返します。
  sd  地方時通日 
  n   月数 
Calendar#internal_timezone
暦法が使用しているタイムゾーンを返します。
これはDate::Extended オブジェクトが保持する時差とは別物です。
例えば、日本では長い間中国での時差をそのまま用いて宣明暦の計算
を行っていました。

プロテクテッド インスタンス メソッド:

Calendar#_date_to_sdn(*date)
年・月・日を地方時正午通日に変換して返します。
サブクラスで再定義してください。
  date 日時を表す配列  年 [,月 [,日]]
Calendar#_time_to_sd(sdn, *time)
時の表現を解釈し、地方時通日に変換して返します。
時刻制度も変わる場合はサブクラスで再定義してください。
  sdn  計算する日の地方時正午通日
  time 時の表現を与える配列
Calendar#_sdn_to_date(sdn)
地方時正午通日を年・月・日に変換して返します。
サブクラスで再定義してください。
  sdn 地方時正午通日
Calendar#_sd_to_time(sd)
地方時通日を時の表現の組に変換して返します。
時刻制度も変わる場合はサブクラスで再定義してください。
  sd 地方時通日
Calendar#_m_in_y(*date)
指定した年に含まれる月の数を返します。
(運用表現の年初は考慮されません)
  date 日時を表現する配列 
Calendar#_d_in_y(*date)
指定した年に含まれる日の数を返します。
(運用表現の年初は考慮されません)
  date 日時を表現する配列 
Calendar#_d_in_m(*date)
指定した月に含まれる日の数を返します。
  date 日時を表現する配列 
Calendar#_matched_list(key, all)
key に一致する場合、自らを配列で返します。
key が false の場合は、一致するものとします。
  key  検索キー
  all  Eras  との互換性のために用意しています。 Eras 以外では使いません。

ブライベート インスタンス メソッド:

Calendar#_compare_dates(d0, d1)
配列 d0, d1 の日時を比較し一致している(true)か否(false)かを返します。
  d0, d1 日時を格納した配列
Calendar#_qualify
Calendar オブジェクトの性質定義を初期設定します。
サブクラスで再定義してください(再定義の際は必ず最後に super
を呼んでください)。
@Title      = self のタイトル
@MonthNames = 月の名前の定義
@LeapNames  = 閏月の命名法
@MeanMonth  = 1ヶ月の平均日数
@DayNames   = 七曜の名前の定義
@TimeUnits  = 年未満の単位の定義
@Format     = 年月日時分秒秒の小数の書式
@DayBorder  = 日の始めの定義
@YearBorder = 年の始めの定義
@YearUnits  = 年以上の単位の定義

データ構造:

@Title : タイトル

Array [キー文字列, ...., キー文字列]
  Calendar.get で文字列から self を検索するためのキーを保持します。

@MonthNames : 月の名前

Hash {月のID => [キー文字列, ...., キー文字列], ,,,. }
  月のIDと月の名前の対応表を保持します。
  月のIDは閏や白分・黒分のある暦法の場合は配列、ない暦法の場合は
  月の通し番号を意味する整数です。

@LeapNames : 閏や白分・黒分のある暦法での月の名前の書式

Array [[閏や白分・黒分の詳細情報番号, 書式 (, 適用する月の番号)], ..]
  @MonthNamesは閏や白分・黒分のある暦法では複雑になります。
  そこで@MonthNames を自動生成するために@LeapNames を使用します。
  本情報は実行時には不要となります。

@AllMonthNames : すべての月の名前を'|'で区切ってつないだ文字列

String '月の名前| ... |月の名前'
  parse, strptime が月の名前を認識するために使用します。。

@MeanMonth : 暦法の1ヶ月に含まれる平均の日数

Rational
  月単位での日付の加減を行う際に、1年の月数と1ヶ月の日数のどちら
  も一定せず、サブクラスでより高速のアルゴリズムが定義されていな
  い場合、本情報を用いて低速アルゴリズムで月単位の加減演算を行い
  ます。

@DayNames : 七曜の日の名前

Array [日, 月, 火, 水, 木, 金, 土曜の名前を表す文字列]
  七曜の番号(0.,,7)と七曜の日の名前の対応表を保持します。
  本情報を用いて、曜日にあわせた日付を特定するためのResidue 
  オブジェクト('1st Sunday'などで検索される)を生成します。

@AllDayNames : すべての日の名前を'|'で区切ってつないだ文字列

String '日の名前| ... |日の名前'
  parse, strptime が日の名前を認識するために使用します。。

@TimeUnits : 月以下の桁の単位情報

Array [[年の月数,正月の値], [月の日数,初日の値], ...]
 月以下の桁の単位情報を保持します。
 例えば、[[12,1], [nil,1], [24,0], [60,0], [60,0], [1000000,0]]は、
   1年の月数は12(一定)で、  1月から始まる。
   1月の日数は不定で、      1日から始まる。
   1日の時数は24(一定)で、  0時から始まる。
   ....
 ということを示します。この場合、1月の日数は不定なので、メソッド
 _d_in_m で随時計算されることになります。

@Format: ISO8601拡張文字列用書式情報

Array [[書式, 補正部に与える文字指定], ..]
 ISO8601拡張文字列用書式情報を保持します。

@DayBorder (Calendar::DayBorder include 時) : 日の境界の定義

Hash {'Offset'=>0 or -1, 'Time'=>[時, 分, 秒, 秒の小数] }
 日の境界が午前0時でない場合、その境界を定義します。
 Offset が 0 の場合は境界が午前0時よりも後、-1の場合は前にあります。
 境界が一定の場合、その時刻を Time で指定します。サブクラスで new_day
 が(日の出、日の入り時刻などに)再定義されている場合、Time は参照さ
 れません。

@YearBorder (Calendar::YearBorder include 時) : 年の境界の定義

Hash {'Offset'=>0 or -1, 'Date'=>[月, 日] }
 年の境界が1月1日でない場合、その境界を定義します。
 Offset が 0 の場合は境界が1月1日よりも後、-1の場合は前にあります。
 境界が一定の場合、その日付を Date で指定します。サブクラスで new_year
 が(復活祭などに)再定義されている場合、Date は参照されません。

@YearUnits (Calendar::YearUnits include 時) : 年以上の桁の単位情報

Array [..., [単位内の年数,最初の年の値]]
 年以上の桁の単位情報を保持します。
例えば、 [[20,0], [20,0]]は、マヤ長期計算法の場合の定義例で、
   要素 0 - バクトゥンは 20 カトゥンからなり、最初のカトゥンは 0
   要素 1 - カトゥンは 20 トゥン(= 年)からなり、最初のトゥンは 0
 ということを示します。