M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2010年3月21日 01:25

春分の日の計算を誰が見ても根拠がわかるようにPerlで記述する

このエントリーをはてなブックマークに追加 mixiチェック

んと個人的にTwitter botを作っている関係で春分の日になんかしゃべらすようなことを考えるわけだけれども、春分の日の計算アルゴリズムっつうのがあって、それを後で見たときに客観的に分かりやっすい方法をと考えた結果がこれだよ!

use strict;
use warnings;
use DateTime;
 
# 1900年~2099年までの春分の日の数学的な簡易な求め方
# http://ja.wikipedia.org/w/index.php?title=%E6%98%A5%E5%88%86%E3%81%AE%E6%97%A5&oldid=28472639
# 西暦年数の4での剰余が0の場合
#   1900年~1956年までは3月21日
#   1960年~2088年までは3月20日
#   2092年~2096年までは3月19日
# 西暦年数の4での剰余が1の場合
#   1901年~1989年までは3月21日
#   1993年~2097年までは3月20日
# 西暦年数の4での剰余が2の場合
#   1902年~2022年までは3月21日
#   2026年~2098年までは3月20日
# 西暦年数の4での剰余が3の場合
#   1903年~1923年までは3月22日
#   1927年~2055年までは3月21日
#   2059年~2099年までは3月20日
my $now = DateTime->now();
my $year = $now->year;
my $mod = $year % 4;
my $syunbun;
if ( $mod == 0 ) {
  if ( 1900 <= $year && $year <= 1956 ) {
    $syunbun = '0321'
  }
  elsif ( 1960 <= $year && $year <= 2088 ) {
    $syunbun = '0320'
  }
  elsif ( 2092 <= $year && $year <= 2096) {
    $syunbun = '0319'
  }
}
elsif ( $mod == 1 ) {
  if ( 1901 <= $year && $year <= 1989 ) {
    $syunbun = '0321'
  }
  elsif ( 1993 <= $year && $year <= 2097 ) {
    $syunbun = '0320'
  }
}
elsif ( $mod == 2 ) {
  if ( 1902 <= $year && $year <= 2022 ) {
    $syunbun = '0321'
  }
  elsif ( 2026 <= $year && $year <= 2098 ) {
    $syunbun = '0320'
  }
}
elsif ( $mod == 3 ) {
  if ( 1903 <= $year && $year <= 1923 ) {
    $syunbun = '0322'
  }
  elsif ( 1927 <= $year && $year <= 2055 ) {
    $syunbun = '0321'
  }
  elsif ( 2059 <= $year && $year <= 2099) {
    $syunbun = '0320'
  }
}
 
print "$syunbun\n";
 
exit;
 
__END__

どうせメンテが必要になるんだからとにかく日本語の文章とif文との対比が付けば意味がわかるという線でやってみた。参照元のWikipediaの固有版のURLも貼っているので、その当時は正しかったんだ!ていう主張もできると思うんだけど。

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3167

コメントする