喫茶XRAYトップページ

[スレッド全体
]

[12265] Re:IsSpecialHoliday返信 削除
2018/9/13 (木) 01:50:32 taka
wikipediaの春分秋分コード表と比べると下記の違いが検出されました

https://ja.wikipedia.org/wiki/春分#日付

2055= 3/21 (year mod 4 = 3)
  error 2055/3/20 | 春分の日
2088= 3/20 (year mod 4 = 0)
  error 2088/3/19 | 春分の日

2074= 9/23 (year mod 4 = 2)
  error 2074/9/22 | 秋分の日

確認コード

function Syunbunday(y : word) : word;
begin
  // 春分日 対応期間: 1924-2091
  //   参考ソース https://ja.wikipedia.org/wiki/春分#日付  , 17世紀から24世紀
  Result := 20;
  case y mod 4 of
    0 : if (y < 1960) then Result := 21;
    1 : if (y < 1992) then Result := 21;
    2 : if (y < 2024) then Result := 21;
    3 : if (y < 2056) then Result := 21;
  end;
end;

function Syuubunday(y : word) : word;
begin
  // 秋分日 対応期間: 1900-2099
  //   参考ソース https://ja.wikipedia.org/wiki/秋分#日付  , 17世紀から24世紀
  Result := 23;
  if (y < 2012) then
    begin
      if (y < 1980) then
        case y mod 4 of
          1 : if (y < 1920) then Result := 24;
          2 : if (y < 1948) then Result := 24;
          3 : if (y < 1980) then Result := 24;
        end
    end
  else
    begin
      Result := 22;
      case y mod 4 of
        1 : if (y < 2044) then Result := 23;
        2 : if (y < 2076) then Result := 23; // 2074(22又は23日)
        3 : Result := 23;
      end
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
  var
   i, year, xday : integer;
   s : string;
begin
  Memo1.Clear;
  for year := 1949 to 2091 do
    begin
      xday := Syunbunday(year);
      s := '';
      IsSpecialHoliday(EncodeDate(year,3,xday), s);
      if ContainsStr(s, '春') then
        Continue;
      Memo1.Lines.Add(Format('%d= 3/%d (year mod 4 = %d)' , [year, xday, year mod 4]));
      for xday := 19 to 23 do
        if IsSpecialHoliday(EncodeDate(year,3,xday), s) then
           Memo1.Lines.Add(Format('  error %d/3/%d | %s' , [year, xday, s]));
    end;
  Memo1.Lines.Add('');
  for year := 1948 to 2099 do
    begin
      xday := Syuubunday(year);
      s := '';
      IsSpecialHoliday(EncodeDate(year,9,xday), s);
      if ContainsStr(s, '秋') then
        Continue;
      Memo1.Lines.Add(Format('%d= 9/%d (year mod 4 = %d)' , [year, xday, year mod 4]));
      for xday := 22 to 24 do
        if IsSpecialHoliday(EncodeDate(year,9,xday), s) then
           Memo1.Lines.Add(Format('  error %d/9/%d | %s' , [year, xday, s]));
    end;
end;


[12267] 春分の日と秋分の日返信 削除
2018/9/13 (木) 12:52:45 Mr.XRAY
▼ takaさん
> wikipediaの春分秋分コード表と比べると下記の違いが検出されました
>


検証お疲れ様です.

> 2055= 3/21 (year mod 4 = 3)
>   error 2055/3/20 | 春分の日


正確なのは 3/21 ということですね.
昔,自分で,理科年表だったかに書いてあった式で実装したことがあります.
参考書も購入しました.図解で計算式の説明がありました.
今はどちるも手元にありません.

ちょっとググってみたら計算式を掲載している記事はあるものの,
出所が明記していないのが多いようです.
引き続き調べてみます.

# 理科年表というのは.. 記憶が...
# 海上保安庁だか,気象庁だかが発行している文書にもあった記憶が...


[12271] Re:春分の日と秋分の日返信 削除
2018/9/13 (木) 21:15:53 taka
▼ Mr.XRAYさん
> ちょっとググってみたら計算式を掲載している記事はあるものの,
> 出所が明記していないのが多いようです.


計算式で検索するとほとんどがパクリ合戦で出典は載っていませんね(笑

その中で、中国ドメインのサイトで
 春分/秋分日の略算式は
『海上保安庁水路部 暦計算研究会編 新こよみ便利帳』
というのがあったので

海上保安庁水路部 暦計算研究会編 新こよみ便利帳
で検索をするとたくさんヒットしました。


暦計算研究会編『新こよみ便利帳 ver.1.2』の式の誤植
誤: 1983
正: 1980
というのも発見しました。

見つける数分前に 式で 1980と1983のパターンがあったので
どっちだろうと思っていたんです。


春分の日の計算式
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))

秋分の日の計算式
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))



[12272] Re2:春分の日と秋分の日返信 削除
2018/9/13 (木) 22:08:47 Mr.XRAY
▼ takaさん

> 計算式で検索するとほとんどがパクリ合戦で出典は載っていませんね(笑

そうなんですよ.
ネットで情報が簡単に入手できるようになったのはいいのですが.
こういう状態がデマとか間違った情報の拡散の原因でしょうね.
 
> その中で、中国ドメインのサイトで
>  春分/秋分日の略算式は
> 『海上保安庁水路部 暦計算研究会編 新こよみ便利帳』
> というのがあったので


あれっ,海上保安庁ですか.
記憶は当てにならない.ハハハッ.

出所 ---> 出典ですね.出所じゃ刑務所帰りになってしまいます.


[12295] Re2:春分の日と秋分の日返信 削除
2018/9/18 (火) 22:14:50 Mr.XRAY
▼ takaさん,どうもです.

taka さんから頂いた情報で計算式を変更してテストしました.
現在のところ OK のようです.
後でサンプルプログラム集の方は更新する予定です.
早く欲しい方のために,以下からダウンロードできるようにしました.
EXE 付です.
ユニット名は各自で適当に変更してください.

http://mrxray.on.coocan.jp/Delphi/zip/plTest_SyunbunSyuubun.zip

2018/09/19 修正 -- 表示間違い.左が旧で右が新でした.


[12296] Re3:春分の日と秋分の日返信 削除
2018/9/19 (水) 12:14:41 Mr.XRAY
ということで,2055年3月の休日は下図のようになります.
上が修正前,下が修正後です.

# 国民の祝日は,官報に記載されたものが正式です.
# これは閣議で決定され,前年の 2 月に公報されます.


[12319] Re4:春分の日と秋分の日返信 削除
2018/9/21 (金) 22:05:01 taka
▼ Mr.XRAYさん
> ということで,2055年3月の休日は下図のようになります.
> 上が修正前,下が修正後です.
>
> # 国民の祝日は,官報に記載されたものが正式です.
> # これは閣議で決定され,前年の 2 月に公報されます.


未確定の祝日・休日

国会への議案提出・議決待ち
 2019年5月1日 即位改元日( 祝日 または 休日 の予定)
   5/1が祝日扱いの場合: 4/30, 5/2は 休日
   5/1が休日扱いの場合: 4/30, 5/2は 平日

 2019年10月22日  即位礼正殿の儀


[12320] Re5:春分の日と秋分の日返信 削除
2018/9/22 (土) 07:12:20 Mr.XRAY
▼ takaさん

> 未確定の祝日・休日

そうでした.元号が変わるんですよね.


[12411] Re5:春分の日と秋分の日返信 削除
2018/11/7 (水) 19:31:44 taka
▼ takaさん
> ▼ Mr.XRAYさん
> > # 国民の祝日は,官報に記載されたものが正式です.
> > # これは閣議で決定され,前年の 2 月に公報されます.
>
> 未確定の祝日・休日
>
> 国会への議案提出・議決待ち
>  2019年5月1日 即位改元日( 祝日 または 休日 の予定)
>    5/1が祝日扱いの場合: 4/30, 5/2は 休日
>    5/1が休日扱いの場合: 4/30, 5/2は 平日
>
>  2019年10月22日  即位礼正殿の儀


ほぼ10連休コースで確定ですね

11/7 内閣第1部会:2019年5月1日と10月22日
      をその年一回限りの祝日扱いとする特別法案を了承した
 ------>
11/9  総務会での正式了承
11/13 閣議決定、国会に法案提出


[12412] Re6:春分の日と秋分の日返信 削除
2018/11/7 (水) 22:01:38 Mr.XRAY
▼ takaさん
> 11/7 内閣第1部会:2019年5月1日と10月22日
>       をその年一回限りの祝日扱いとする特別法案を了承した


追加しなきゃならんですね (^^)


[12297] Re2:春分の日と秋分の日返信 削除
2018/9/19 (水) 19:24:37 Mr.XRAY
> 春分の日の計算式
> 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))
>
> 秋分の日の計算式
> 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))


int 関数を Delphi の Floor 関数に置き換えればそのまま使用できます.

        int(19.8277+0.242194*(年-1980)-int((年-1980)/4))
            ↓
dDay := Floor(19.8277 + 0.242194 * (AYear - 1980) - Floor((AYear - 1980) / 4));

[System.Math.Floor - RAD Studio API Documentation]
http://docwiki.embarcadero.com/Libraries/Tokyo/ja/System.Math.Floor


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82