Hatena::ブログ(Diary)

ザリガニが見ていた...。 このページをアンテナに追加 RSSフィード

2014-09-29

日本の祝日に関するメモ書き

日本の祝日を出力するJPDateクラス(jcal.rb)を作成する上で調べたことを、忘れないようにメモ書き。

  • リンク先の各サイトの素晴らしく貴重な情報には、とても感謝しています。

カレンダーに関する知識

春分・秋分に関する知識

  • 二十四節気の略算式
  • 天文メモ
    • 1900年から2099年対応の二十四節気(春分・秋分も含まれる)を求める数式が紹介されている。
    • 実際よく利用しそうな200年間を1つの数式で算出できるので、とっても便利な数式である。

春分の日の計算式 (3月XX日)
1851-1899年通用=int(19.8277+0.242194*(年-1980)-int((年-1983)/4))
1900-1979年通用=int(20.8357+0.242194*(年-1980)-int((年-1983)/4))
1980-2099年通用=int(20.8431+0.242194*(年-1980)-int((年-1980)/4))
2100-2150年通用=int(21.8510+0.242194*(年-1980)-int((年-1980)/4))

秋分の日の計算式  (9月XX日)
1851-1899年通用=int(22.2588+0.242194*(年-1980)-int((年-1983)/4))
1900-1979年通用=int(23.2588+0.242194*(年-1980)-int((年-1983)/4))
1980-2099年通用=int(23.2488+0.242194*(年-1980)-int((年-1980)/4))
2100-2150年通用=int(24.2488+0.242194*(年-1980)-int((年-1980)/4))

※「春分の日」「秋分の日」の祝日の正式には
  海上保安庁が「官報」に告示することで確定します。
http://hp.vector.co.jp/authors/VA006522/zatugaku/syunbun.txt




 - 1851 - 1899	[19.2811 + 0.242194 * (y - 1980) - [(y - 1983) / 4
 + 1851 - 1899	[19.8277 + 0.242194 * (y - 1980) - [(y - 1983) / 4

小数点の丸め方

  • 春分・秋分を求める数式で、小数点以下を丸める処理を誤ると日付が1日ズレてしまい、ガッカリすることになる。
  • 例えば、以下の数式のint関数は、小数点以下を削除して、整数部分のみをそのまま残す意味で使われている。
1900-1979年通用=int(20.8357+0.242194*(年-1980)-int((年-1983)/4))

int(1.25) = 1
int(1.75) = 1
int(-1.25) = -1
int(-1.75) = -1

  • 一方、表計算アプリのINT関数はマイナスを処理する時、意味が違ってくる。
int(1.25) = 1
int(1.75) = 1
int(-1.25) = -2
int(-1.75) = -2

  • 表計算アプリで同じ処理をしようとすれば、TRUNC関数(あるいはFIX関数)を使う必要がある。
TRUNC(1.25) = 1
TRUNC(1.75) = 1
TRUNC(-1.25) = -1
TRUNC(-1.75) = -1

  • この違いは何かと言えば、INTは、元の少数を超えない整数に丸める。TRUNCは、少数部分を削除して、整数部分をそのまま残す。
  • 以下のように積み重ねた整数の箱のモデルをイメージすれば、マイナスの場合、INTは常に箱の底となる整数に丸めるのだ。
|     |
+-----+ +2
|+1.25|
|+1.5 |
|+1.75|
+-----+ +1	<--INT(1.5) <--TRUNC(1.5)
|     |
|     |
|     |
+-----+  0
|     |
|     |
|     |
+-----+ -1	<--TRUNC(1.5)
|-1.25|
|-1.5 |
|-1.75|
+-----+ -2	<--INT(-1.5)
|     |
  • ちなみに、Rubyのceil、floorは、この箱のモデルをイメージすると理解しやすい。
ceil天井という意味常に天井の値を取る
floor床という意味常に床(底)の値を取る(INTと同等)
to_ito Integerの略少数を削除して、整数部分をそのまま残す(TRUNCと同等)
-1/4整数の割り算= -0.25.floor = -1(整数同士の割り算はfloorされる)

  • ところで、最初の数式に戻って、以下のように変形してみる。
  1900-1979年通用=int(20.8357+0.242194*(年-1980) - int((年 - 1983) / 4))
= 1900-1979年通用=int(20.8357+0.242194*(年-1980) - int((年 - 1980 - 3) / 4))
= 1900-1979年通用=int(20.8357+0.242194*(年-1980) - int((年 - 1980) / 4 - (3 / 4)))
= 1900-1979年通用=int(20.8357+0.242194*(年-1980) - int((年 - 1980) / 4 - 0.75))
  • あれあれ?、元の少数に0.75を引き算して、TRUNCしている!
  • これを先程の箱のモデルに当てはめてみると...
TRUNC(-1.25 - 0.75) = TRUNC(-2   ) = -2
TRUNC(-1.5  - 0.75) = TRUNC(-2.25) = -2
TRUNC(-1.75 - 0.75) = TRUNC(-2.5 ) = -2

INT(-1.25) = -2
INT(-1.5 ) = -2
INT(-1.75) = -2

  • つまり、最初の数式は表計算アプリやRubyなら、以下のように表現できるのだ!
    • INT関数が使える環境なら、1983という半端な数値を使う必要はない。
    • 表計算アプリ
  int( 20.8357 + 0.242194 * (年 - 1980) - int( (年 - 1983) / 4) )
= INT( 20.8357 + 0.242194 * (年 - 1980) - INT( (年 - 1980) / 4) )
    • Ruby
  int( 20.8357 + 0.242194 * (年 - 1980) - int( (年 - 1983) / 4) )
= ( 20.8357 + 0.242194 * (年 - 1980) - ( (年 - 1980) / 4).floor ).floor
= ( 20.8357 + 0.242194 * (年 - 1980) - (年 - 1980) / 4 ).floor

春分・秋分を求める数式

  • 以上のことを理解して、春分・秋分を求める数式は、以下のように定義できる。
春分の日の計算式(3月XX日のXXを算出する)
1900-2099年: INT(  21.4471 + 0.242377 * (年-1900) - INT( (年-1900)/4 )  )

1851-1899年: INT(  19.8277 + 0.242194 * (年-1980) - INT( (年-1980)/4 )  )
1900-1979年: INT(  20.8357 + 0.242194 * (年-1980) - INT( (年-1980)/4 )  )
1980-2099年: INT(  20.8431 + 0.242194 * (年-1980) - INT( (年-1980)/4 )  )
2100-2150年: INT(  21.8510 + 0.242194 * (年-1980) - INT( (年-1980)/4 )  )
秋分の日の計算式(9月XX日のXXを算出する)
1900-2099年: INT(  23.8896 + 0.242032 * (年-1900) - INT( (年-1900)/4 )  )

1851-1899年: INT(  22.2588 + 0.242194 * (年-1980) - INT( (年-1980)/4 )  )
1900-1979年: INT(  23.2588 + 0.242194 * (年-1980) - INT( (年-1980)/4 )  )
1980-2099年: INT(  23.2488 + 0.242194 * (年-1980) - INT( (年-1980)/4 )  )
2100-2150年: INT(  24.2488 + 0.242194 * (年-1980) - INT( (年-1980)/4 )  )

  • 実際に利用しているRubyコード
  def equinox_day(y, m)
    case y
    when 1851..1899
      dy = y - 1980
      return Date.new(y, m, (19.8277 + 0.242194*dy - dy/4).to_i) if m == 3
      return Date.new(y, m, (22.2588 + 0.242194*dy - dy/4).to_i) if m == 9
    when 1900..2099
      dy = y - 1900
      return Date.new(y, m, (21.4471 + 0.242377*dy - dy/4).to_i) if m == 3
      return Date.new(y, m, (23.8896 + 0.242032*dy - dy/4).to_i) if m == 9
    when 2100..2150
      dy = y - 1980
      return Date.new(y, m, (21.8510 + 0.242194*dy - dy/4).to_i) if m == 3
      return Date.new(y, m, (24.2488 + 0.242194*dy - dy/4).to_i) if m == 9
    end
  end

祝日・祭日に関する知識


  • 紀元節 - Wikipedia
    • 唯一、行政歴史研究会に記述のない「明治6年 1873年1月29日の神武天皇即位日(後に紀元節と改称)」については、
    • 太陽暦に改暦直後の明治6年 1873年年1月4日の太政官布告第1号で祝日とされ、各地で拝式が行われたとの記載がある。


日本の祝日・祭日・休日の遷移

以上の布告・勅令・法律を読み解くと、太陽暦へ改暦以降の日本の祝日は、以下のように遷移してきたと解釈できる。

戦前(明治6年 1873年〜昭和23年 1948年)
変更内容 new 春季皇靈祭mv 神嘗祭mv 天長節new 天長節祝日mv 天長節
変更内容 new 秋季皇靈祭 mv 孝明天皇明治天皇 new 明治節
変更内容 mv 明治天皇祭 大正天皇祭
施行日西暦1873/01/041873/10/141878/06/051879/07/051912/09/031913/07/161927/03/03
施行日和暦明治6年明治6年明治11年明治12年大正元年大正2年昭和2年
1月3日 元始祭元始祭元始祭元始祭元始祭元始祭
1月5日 新年宴會新年宴會新年宴會新年宴會新年宴會新年宴會
1月29日神武天皇即位日
1月30日 孝明天皇祭孝明天皇祭孝明天皇祭
2月11日 紀元節紀元節紀元節紀元節紀元節紀元節
春分日 春季皇靈祭春季皇靈祭春季皇靈祭春季皇靈祭春季皇靈祭
4月3日 神武天皇祭神武天皇祭神武天皇祭神武天皇祭神武天皇祭神武天皇祭
4月29日 天長節
7月30日 明治天皇祭明治天皇祭
8月11日
8月31日 天長節天長節
9月17日 神嘗祭神嘗祭
秋分日 秋季皇靈祭秋季皇靈祭秋季皇靈祭秋季皇靈祭秋季皇靈祭
10月17日 神嘗祭神嘗祭神嘗祭神嘗祭
10月31日 天長節祝日
11月3日 天長節天長節天長節 明治節
11月11日天長節
11月23日 新嘗祭新嘗祭新嘗祭新嘗祭新嘗祭新嘗祭
12月25日 大正天皇祭

四方節について

  • 四方節(1月1日)は紀元節・天長節・明治節とともに四大節の1つだが、
  • 実は法令で定められた休日ではなく、年始の習慣としての休日であった。
  • (現在の1月2日、3日が慣例的に休日となっている扱いと似ている)
戦後(昭和23年 1948年〜)
変更内容 new 建国記念日new 振替休日new 国民の休日mv 天皇誕生日new 海の日mv 成人の日mv 海の日mv みどりの日new 山の日
変更内容 new 体育の日 new みどりの日 mv 体育の日mv 敬老の日new 昭和の日
変更内容
施行日西暦1948/07/201966/06/251973/04/121985/12/271989/02/171996/01/012000/01/012003/01/012007/01/012016/01/01
施行日和暦昭和23年昭和41年昭和48年昭和60年平成元年平成8年平成12年平成15年平成19年平成28年
1月1日元日元日元日元日元日元日元日元日元日元日
1月第2月曜日 成人の日成人の日成人の日成人の日
1月15日成人の日成人の日成人の日成人の日成人の日成人の日
2月11日 建国記念の日建国記念の日建国記念の日建国記念の日建国記念の日建国記念の日建国記念の日建国記念の日建国記念の日
春分日春分の日春分の日春分の日春分の日春分の日春分の日春分の日春分の日春分の日春分の日
4月29日天皇誕生日天皇誕生日天皇誕生日天皇誕生日みどりの日みどりの日みどりの日みどりの日昭和の日昭和の日
5月3日憲法記念日憲法記念日憲法記念日憲法記念日憲法記念日憲法記念日憲法記念日憲法記念日憲法記念日憲法記念日
5月4日 みどりの日みどりの日
5月5日こどもの日こどもの日こどもの日こどもの日こどもの日こどもの日こどもの日こどもの日こどもの日こどもの日
7月第3月曜日 海の日海の日海の日
7月20日 海の日海の日
8月11日 山の日
9月第3月曜日 敬老の日敬老の日敬老の日
9月15日 敬老の日敬老の日敬老の日敬老の日敬老の日敬老の日
秋分日秋分の日秋分の日秋分の日秋分の日秋分の日秋分の日秋分の日秋分の日秋分の日秋分の日
10月第2月曜日 体育の日体育の日体育の日体育の日
10月10日 体育の日体育の日体育の日体育の日体育の日
11月3日文化の日文化の日文化の日文化の日文化の日文化の日文化の日文化の日文化の日文化の日
11月23日勤労感謝の日勤労感謝の日勤労感謝の日勤労感謝の日勤労感謝の日勤労感謝の日勤労感謝の日勤労感謝の日勤労感謝の日勤労感謝の日
12月23日 天皇誕生日天皇誕生日天皇誕生日天皇誕生日天皇誕生日天皇誕生日
振替休日 振替休日振替休日振替休日振替休日振替休日振替休日振替休日振替休日
国民の休日 国民の休日国民の休日国民の休日国民の休日国民の休日国民の休日国民の休日
臨時の祝日
大正 4年 1915年11月10日即位ノ礼
大正 4年 1915年11月14日大嘗祭
大正 4年 1915年11月16日即位礼及大嘗祭後大饗第一日
昭和 3年 1928年11月10日即位ノ礼
昭和 3年 1928年11月14日大嘗祭
昭和 3年 1928年11月16日即位礼及大嘗祭後大饗第一日
昭和34年 1959年 4月10日皇太子明仁親王の結婚の儀
平成元年 1989年 2月24日昭和天皇の大喪の礼
平成 2年 1990年11月12日即位礼正殿の儀
平成 5年 1993年 6月 9日皇太子徳仁親王結婚の儀

祝日を定義したRubyコード

require 'date'

# 日本の太陽暦の始まり
# 明治5年11月9日・1872年12月9日施行 太政官布告第337号 改暦ノ布告
# 「今般太陰&#26310;ヲ廢シ太陽&#26310;御頒行相成候ニ付來ル12月3日ヲ以テ明治6年1月1日ト被定候事」
#    太陰暦            太陽暦            西暦
#   明治5年12月 2日                     1872年12月31日    太陰暦ここまで
#   明治5年12月 3日    明治6年 1月 1日    1873年 1月 1日    太陽暦ここから
# JPDateクラスは、太陽暦 明治6年・1873年1月1日以降の日本の祝日を扱う
class JPDate < Date
  HOLIDAYS = []

  # 以下の法律に準拠する
  # 明治 6年 1873年 1月 4日施行 太政官布告第1号 五節ヲ廃シ祝日ヲ定ム
  HOLIDAYS += [
    {month:1,  day:29,          term:1873..1873, name:'神武天皇即位日'},
  ]

  # 明治 6年 1873年10月14日施行 太政官布告第344号 年中祭日祝日ノ休暇日ヲ定ム
  # 明治11年 1878年 6月 5日施行 太政官布告第 23号 年中祭日祝日ノ休暇日ヲ定ム(改正)
  # 明治12年 1879年 7月 5日施行 太政官布告第 27号 年中祭日祝日ノ休暇日ヲ定ム(改正)
  HOLIDAYS += [
    {month:1,  day:3,           term:1874..1912, name:'元始祭'},
    {month:1,  day:5,           term:1874..1912, name:'新年宴會'},
    {month:1,  day:30,          term:1874..1912, name:'孝明天皇祭'},
    {month:2,  day:11,          term:1874..1912, name:'紀元節'},
    {month:3,  day:'spring_day',term:1879..1912, name:'春季皇靈祭'},# 1878年6月5日追加
    {month:4,  day:3,           term:1874..1912, name:'神武天皇祭'},
    {month:9,  day:'autumn_day',term:1878..1911, name:'秋季皇靈祭'},# 1878年6月5日追加
    {month:9,  day:17,          term:1874..1878, name:'神嘗祭'},
    {month:10, day:17,          term:1879..1911, name:'神嘗祭'},   # 1879年7月5日修正
    {month:11, day:3,           term:1873..1911, name:'天長節'},
    {month:11, day:23,          term:1873..1911, name:'新嘗祭'},
  ]

  # 四方節について
  # 四方節(1月1日)は紀元節・天長節・明治節とともに四大節の1つだが
  # 実は法令で定められた休日ではなく、年始の習慣としての休日であった
  # (現在の1月2日、3日が慣例的に休日となっている扱いと似ている)

  # 大正元年 1912年 9月 4日施行 勅令第 19号 休日ニ關スル件
  # 大正 2年 1913年 7月16日施行 勅令第259号 休日ニ關スル件(改正)
  # 昭和 2年 1927年 3月 4日施行 勅令第 25号 休日ニ關スル件(改正)
  HOLIDAYS += [
    {month:1,  day:3,           term:1913..1948, name:'元始祭'},
    {month:1,  day:5,           term:1913..1948, name:'新年宴會'},
    {month:2,  day:11,          term:1913..1948, name:'紀元節'},
    {month:3,  day:'spring_day',term:1913..1948, name:'春季皇靈祭'},
    {month:4,  day:3,           term:1913..1948, name:'神武天皇祭'},
    {month:4,  day:29,          term:1927..1948, name:'天長節'},   # 1927年3月4日改正
    {month:7,  day:30,          term:1913..1926, name:'明治天皇祭'},
    {month:8,  day:31,          term:1913..1926, name:'天長節'},
    {month:9,  day:'autumn_day',term:1912..1947, name:'秋季皇靈祭'},
    {month:10, day:17,          term:1912..1947, name:'神嘗祭'},
    {month:10, day:31,          term:1913..1926, name:'天長節祝日'},# 1913年7月16日改正
    {month:11, day:3,           term:1927..1947, name:'明治節'},   # 1927年3月4日改正
    {month:11, day:23,          term:1912..1947, name:'新嘗祭'},
    {month:12, day:25,          term:1927..1947, name:'大正天皇際'},# 1927年3月4日改正
  ]

  # 昭和23年 1948年 7月20日公布・施行 法律第178号 国民の祝日に関する法律
  # 昭和41年 1966年 6月25日公布・施行 法律第 86号 国民の祝日に関する法律(改正)
  # 昭和48年 1973年 4月12日公布・施行 法律第 10号 国民の祝日に関する法律(改正)
  # 昭和60年 1985年12月27日公布・施行 法律第103号 国民の祝日に関する法律(改正)
  # 平成元年 1989年 2月17日公布・施行 法律第  5号 国民の祝日に関する法律(改正)
  # 平成 7年 1995年 3月 8日公布・平成 8年 1996年1月1日施行 法律第 22号 国民の祝日に関する法律(改正)
  # 平成10年 1998年10月21日公布・平成12年 2000年1月1日施行 法律第141号 国民の祝日に関する法律(改正)
  # 平成13年 2001年 6月22日公布・平成15年 2003年1月1日施行 法律第 59号 国民の祝日に関する法律(改正)
  # 平成17年 2005年 5月20日公布・平成19年 2007年1月1日施行 法律第 43号 国民の祝日に関する法律(改正)
  # 平成26年 2014年 5月30日公布・平成28年 2016年1月1日施行 法律第 43号 国民の祝日に関する法律(改正)
  HOLIDAYS += [
    {month:1,  day:1,           term:1949..9999, name:'元旦'},
    {month:1,  day:15,          term:1949..1999, name:'成人の日'},
    {month:1,  day:'monday 2',  term:2000..9999, name:'成人の日'},
    {month:2,  day:11,          term:1967..9999, name:'建国記念日'},
    {month:3,  day:'spring_day',term:1949..2099, name:'春分の日'},
    {month:4,  day:29,          term:1949..1988, name:'天皇誕生日'},
    {month:4,  day:29,          term:1989..2006, name:'みどりの日'},
    {month:4,  day:29,          term:2007..9999, name:'昭和の日'},
    {month:5,  day:3 ,          term:1949..9999, name:'憲法記念日'},
    {month:5,  day:4 ,          term:2007..9999, name:'みどりの日'},
    {month:5,  day:5 ,          term:1949..9999, name:'こどもの日'},
    {month:7,  day:20,          term:1996..2002, name:'海の日'},
    {month:7,  day:'monday 3',  term:2003..9999, name:'海の日'},
    {month:8,  day:11,          term:2016..9999, name:'山の日'},
    {month:9,  day:15,          term:1966..2002, name:'敬老の日'},
    {month:9,  day:'monday 3',  term:2003..9999, name:'敬老の日'},
    {month:9,  day:'autumn_day',term:1948..2099, name:'秋分の日'},
    {month:10, day:10,          term:1966..1999, name:'体育の日'},
    {month:10, day:'monday 2',  term:2000..9999, name:'体育の日'},
    {month:11, day:3,           term:1948..9999, name:'文化の日'},
    {month:11, day:23,          term:1948..9999, name:'勤労感謝の日'},
    {month:12, day:23,          term:1989..9999, name:'天皇誕生日'},
  ]
  SUBSTITUTE_HOLIDAY_START = Date.new(1973,  4, 12)
  NATIONAL_HOLIDAY_START   = Date.new(1985, 12, 27)

  # 臨時の休日
  # 大正 4年 1915年 9月21日施行 勅令161号 大禮ニ關スル休日ノ件
  # 昭和 3年 1928年 9月 8日施行 勅令226号 大禮ニ關スル休日ノ件
  # 昭和34年 1959年 3月17日施行 法律 16号 皇太子明仁親王の結婚の儀の行われる日を休日とする法律
  # 平成元年 1989年 2月17日施行 法律  4号 昭和天皇の大喪の礼の行われる日を休日とする法律
  # 平成 2年 1990年 6月 1日施行 法律 24号 即位礼正殿の儀の行われる日を休日とする法律
  # 平成 5年 1993年 4月30日施行 法律 32号 皇太子徳仁親王の結婚の儀の行われる日を休日とする法律
  HOLIDAYS += [
    {month:11, day:10,          term:1915..1915, name:'即位ノ礼'},
    {month:11, day:14,          term:1915..1915, name:'大嘗祭'},
    {month:11, day:16,          term:1915..1915, name:'大饗第一日'},
    {month:11, day:10,          term:1928..1928, name:'即位ノ礼'},
    {month:11, day:14,          term:1928..1928, name:'大嘗祭'},
    {month:11, day:16,          term:1928..1928, name:'大饗第一日'},
    {month:4,  day:10,          term:1959..1959, name:'結婚の儀'},
    {month:2,  day:24,          term:1989..1989, name:'大喪の礼'},
    {month:11, day:12,          term:1990..1990, name:'即位の礼'},
    {month:6,  day:9,           term:1993..1993, name:'結婚の儀'},
  ]

...中略...

end # class JPDate

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/zariganitosh/20140929/japanese_holiday_memo
リンク元