喫茶XRAYトップページ


[12237] 指定した日が祝日かどうかを調べる返信 削除
2018/9/7 (金) 20:16:44 igy
以前、
[8163] Re5:TDateTimePicker で元号表示
http://mrxray.on.coocan.jp/bbs/DelphiBBS/mrxray_delphifan_coffe.cgi?tree=s8156#8163

で紹介した、DEKOさんのところの

指定した日が祝日かどうかを調べる
https://ht-deko.com/tech004.html#tech026

が、更新されてました!

> 2018/07/03: 五輪祝日移動法および皇室典範特例法に対応。

とのことです。

また、Qiita にも、

[Qiita] Delphi で "指定した日が祝日かどうか" を調べる
https://qiita.com/ht_deko/items/a0cbbbd899c1c016ae67

の記事が公開されています。


[12238] Re:指定した日が祝日かどうかを調べる返信 削除
2018/9/7 (金) 23:06:45 Mr.XRAY
▼ igyさん,どうもです.

> > 2018/07/03: 五輪祝日移動法および皇室典範特例法に対応。
>
> とのことです。


情報ありがとうございます.
後でサンプルプログラム集に添付のユニットを差し替えます.
えっと IsSpecialHoliday で検索... [164] [165] のサンプルだけのようです.


[12506] 内閣府:国民の祝日 更新されています。返信 削除
2018/12/26 (水) 20:13:14 taka
国民の祝日について - 内閣府
・「天皇の即位の日及び即位礼正殿の儀の行われる日を休日とする法律」について
https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html#sokui
 Last-Modified: Tue, 25 Dec 2018 05:24:29 GMT

昨日25日午後に更新されたようです


● 振替休日を含む csvファイル
「国民の祝日について - 内閣府」のページの編集担当者が変わってしまったようですね
今回の更新に伴い
2種類あったcsvファイルのうちの
振替休日を含む csvファイルの配布は終了したようです。
※ 内閣府に苦情いれておけば、後日最新版に反映されたものが復活するかもしれませんけど

平成29年(2017年)から平成31年(2019年)国民の祝日(csv形式:2KB)
平成29年(2017年)から平成31年(2019年)国民の祝日等(いわゆる振替休日等を含む)(csv形式:2KB)



平成30年(2018年)から平成31年(2019年)国民の祝日(csv形式:2KB)


[12507] Re:内閣府:国民の祝日 更新されています。返信 削除
2018/12/27 (木) 05:30:17 DEKO 〔HomePage

[12508] Re:内閣府:国民の祝日 更新されています。返信 削除
2018/12/27 (木) 09:13:42 Mr.XRAY
▼ takaさん
> 国民の祝日について - 内閣府
> ・「天皇の即位の日及び即位礼正殿の儀の行われる日を休日とする法律」について
> https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html#sokui
>  Last-Modified: Tue, 25 Dec 2018 05:24:29 GMT
>
> 昨日25日午後に更新されたようです


おおっ,ついに.
DEKO さんが対応したというので,後でコピペさせていただきます (^^)


[12242] Re:指定した日が祝日かどうかを調べる返信 削除
2018/9/9 (日) 01:47:00 taka
▼ igyさん
> 以前、
> [8163] Re5:TDateTimePicker で元号表示
> http://mrxray.on.coocan.jp/bbs/DelphiBBS/mrxray_delphifan_coffe.cgi?tree=s8156#8163
>
> で紹介した、DEKOさんのところの
>
> 指定した日が祝日かどうかを調べる
> https://ht-deko.com/tech004.html#tech026
>
> が、更新されてました!
>
> > 2018/07/03: 五輪祝日移動法および皇室典範特例法に対応。
>
> とのことです。
>
> また、Qiita にも、
>
> [Qiita] Delphi で "指定した日が祝日かどうか" を調べる
> https://qiita.com/ht_deko/items/a0cbbbd899c1c016ae67
>
> の記事が公開されています。


毎年cao.go.jpから定期的にcsvファイルをダウンロードすると簡単かもしれません。
内閣府ホーム  >  内閣府の政策  >  制度  >  国民の祝日について
http://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html#syukujitu
csv: http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu_kyujitsu.csv

googleカレンダー
https://calendar.google.com/calendar/ical/japanese__ja@holiday.calendar.google.com/public/full.ics

mozillaカレンダー
https://www.mozilla.org/media/caldata/JapanHolidays.ics

mozillaカレンダーは抽出しにくいので、
最初の2つからパクってくるのが簡単だと思います



[12243] Googleカレンダーからのパクリ サンプル返信 削除
2018/9/9 (日) 01:49:25 taka
// Form に Memo1, Button1 を配置します

uses System.RegularExpressions, System.Net.HttpClient, System.StrUtils;

function getGoogleIcs() : string; forward;

procedure TForm1.Button1Click(Sender: TObject);
  var
   i, j : Integer;
   k, v : string;
   AMatchCollection : TMatchCollection;
   AStringList : TStringList;
begin
  Memo1.Clear;
  Memo1.ScrollBars := ssBoth;

  AStringList := TStringList.Create;
  try
    AMatchCollection :=  TRegEx.Matches(
        AdjustLineBreaks(getGoogleIcs()),
        'BEGIN:VEVENT\s+\n(.+?)\s+\nEND:VEVENT',
        [roSingleLine, roIgnoreCase]);
    for i := 0 to AMatchCollection.Count-1 do
    begin
      with  TRegEx.Matches(
          AMatchCollection.Item[i].Groups.Item[1].Value,
          '^(DTSTART|SUMMARY)[:;](.+)$',
          [roMultiLine, roIgnoreCase]) do
      begin
        k := '';
        v := '';
        for j := 0 to Count-1 do
        begin
          if Item[j].Groups.Item[1].Value = 'DTSTART' then
            k := TRegEx.Replace(
                      Item[j].Groups.Item[2].Value,
                      '.+DATE:', '', [roIgnoreCase])
          else
            v := Item[j].Groups.Item[2].Value;
        end;
        AStringList.Add(k + '=' + v);
      end;
    end;
    AStringList.Sort;
    if AStringList.Count > 0 then
      Memo1.Lines.Add(AStringList.Text)
    else
      Memo1.Lines.Add('取得失敗');
  finally
    AStringList.Free;
  end;
end;

function getGoogleIcs() : string;
  var
   filename, url, data : string;
   HttpClient : THTTPClient;
   response : IHTTPResponse;
   t : TDateTime;
begin
  Result := '';
  url := 'https://calendar.google.com/calendar/ical/japanese__ja@holiday.calendar.google.com/public/full.ics';
  filename := ExtractFilePath(Application.ExeName) + 'full.ics';
  if Not FileExists(filename) Or
     (FileAge(filename, t) and (t < now - 90) ) then
  begin
    HttpClient := THTTPClient.Create;
    try
      response := HttpClient.Get(url);
      if response.StatusCode = 200 then
      begin
        Result := response.ContentAsString();
        if Not ContainsText(Result, 'BEGIN:VEVENT') then
           Result := '';
      end;
      if Length(Result)>0 then
        with TFileStream.Create(filename, fmCreate) do
        try
          CopyFrom(response.ContentStream, -1);
        finally
          Free;
        end;
    finally
      HttpClient.Free;
    end;
  end;
  if Length(Result)>0 then
    Exit;

  if FileExists(filename) then
    with TBytesStream.Create() do
    try
      LoadFromFile(filename);
      Result := UTF8ToString(RawByteString(bytes));
    finally
      Free;
    end;
end;

[12244] Re:Googleカレンダーからのパクリ サンプル返信 削除
2018/9/9 (日) 21:31:03 Mr.XRAY
▼ takaさんどうもです.

ネットに接続されていれば googleカレンダー のは便利ですね.
google のもそうですが,内閣府のも,こんなのがあるなんて知りませんでした.
なるほど.

サンプルプログラム集の [164] [165] を新しいコード (といっても DEKO さんの
コードのコピペですが ) に更新しました.
また,日付時刻入力コンポの記事に以下を追加しました.

[指定した日が祝日かどうかを調べる]
http://mrxray.on.coocan.jp/Delphi/plDateEdit/Hints_Troubles.htm#94



[12245] Re2:Googleカレンダーからのパクリ サンプル返信 削除
2018/9/9 (日) 22:58:02 taka
▼ Mr.XRAYさん
> ▼ takaさんどうもです.
>
> ネットに接続されていれば googleカレンダー のは便利ですね.
> google のもそうですが,内閣府のも,こんなのがあるなんて知りませんでした.

今年の3月必要だったので調べて発見しました

http://www.data.go.jp/data/dataset/cao_20160323_0068
ここの情報によると
2016年2月からcsv配布が始まったようです。



[12246] Re3:Googleカレンダーからのパクリ サンプル返信 削除
2018/9/9 (日) 23:15:54 Mr.XRAY
▼ takaさん

> http://www.data.go.jp/data/dataset/cao_20160323_0068
> ここの情報によると
> 2016年2月からcsv配布が始まったようです。


比較的新しいとも言えますね.
いずれにしても貴重です.


[12247] Re2:Googleカレンダーからのパクリ サンプル返信 削除
2018/9/10 (月) 19:08:26 taka
▼ Mr.XRAYさん
> サンプルプログラム集の [164] [165] を新しいコード (といっても DEKO さんの
> コードのコピペですが ) に更新しました.
> また,日付時刻入力コンポの記事に以下を追加しました.


unit plIDateEditPickerIsHoliday;

ほかの暦ソースから自動抽出して検証してみたのですが、間違いがありました。

比較に使用したソース:個人ホームページにあった祝日データ表
(1948-2011年, データの信ぴょう性はないが、以下の暦要項と比較したらしい)

 -1999: データの違い 60件
      海の日 開始年の間違い1996
      建国記念の日 開始年の間違い1967
      ソース側のデータ欠落1件
      ソース側の誤り 17件
      他40件は未検証
 2000-2011年: 天皇誕生日の判定間違い
   12月の天皇誕生日の符号が間違っています
      誤: dYear >= 2018
      正: dYear <= 2018
 2012年以降は比較していないので未検証

祝日は、データベース化したほうが無難。

 --------------------

・国民の祝日の変遷と暦要項
  国立天文台 > 暦計算室 > 暦要項 > 備考
  http://eco.mtk.nao.ac.jp/koyomi/yoko/appendix.html#holiday

・国民の祝日 明治〜平成
  国立天文台 > 暦計算室 > 暦要項 >  PDF版一覧
  http://eco.mtk.nao.ac.jp/koyomi/yoko/archives.html
  ※データ化はされていない



[12248] Re3:Googleカレンダーからのパクリ サンプル返信 削除
2018/9/10 (月) 20:47:04 Mr.XRAY
▼ takaさんどうもです.

> ほかの暦ソースから自動抽出して検証してみたのですが、間違いがありました。

あららっ.お手数おかけしました.
さて...っと...

> 祝日は、データベース化したほうが無難。

う〜む.


[12250] Re4:Googleカレンダーからのパクリ サンプル返信 削除
2018/9/10 (月) 22:45:06 taka
▼ Mr.XRAYさん
> ▼ takaさんどうもです.
>
> > ほかの暦ソースから自動抽出して検証してみたのですが、間違いがありました。
>
> あららっ.お手数おかけしました.
> さて...っと...


未検証部分の大部分が比較用にもってきたデータの間違いでした。

問題の部分だけ抜粋しました

1966/2/11 期待値[False] 実際の値[True]
1979/9/23 期待値[False] 実際の値[True]
1995/7/20 期待値[False] 実際の値[True]
2017/12/23 期待値[True] 実際の値[False]

procedure TForm1.Button2Click(Sender: TObject);
  const bstr : array[Boolean] of string = ('False', 'True');
  procedure check(ADate : TDateTime; ExpectedRes : boolean);
    var b: boolean;
        name : string;
  begin
    b := IsSpecialHoliday(ADate, name);
    if (b <> ExpectedRes) then
       Memo1.Lines.Add(FormatDateTime('yyyy/m/d', ADate)
                     + Format(' 期待値[%s] 実際の値[%s]',
                      [ bstr[ExpectedRes], bstr[b] ]));
  end;
begin
  // 間違い検証用
  check(EncodeDate(1966,2,11), False); // 建国記念の日 1967-
  check(EncodeDate(1979,9,23), False);
  check(EncodeDate(1979,9,24), True);  // 秋分の日 1979/9/24
  check(EncodeDate(1995,7,20), False); // 海の日 1996-
  check(EncodeDate(2017,12,23), True); // 天皇誕生日
end;


[12251] Re5:Googleカレンダーからのパクリ サンプル返信 削除
2018/9/10 (月) 23:14:38 Mr.XRAY
▼ takaさんどうもです.

> 未検証部分の大部分が比較用にもってきたデータの間違いでした。
>
> 問題の部分だけ抜粋しました


わわわっ ! ありがとうございます.
他の祝日の検証と思い,何かテストプログラムを,と思っていたところです.
思っていただけですが (^^;


[12252] Re6:Googleカレンダーからのパクリ サンプル返信 削除
2018/9/10 (月) 23:46:49 taka
▼ Mr.XRAYさん
> ▼ takaさんどうもです.
>
> > 未検証部分の大部分が比較用にもってきたデータの間違いでした。
> >
> > 問題の部分だけ抜粋しました
>
> わわわっ ! ありがとうございます.
> 他の祝日の検証と思い,何かテストプログラムを,と思っていたところです.
> 思っていただけですが (^^;


もう1個ありました。
check(EncodeDate(2020,8,11), False);

dYear >= 2016 に
追加で dYear <> 2020
がいるんだと思います。

[12249] Re3:Googleカレンダーからのパクリ サンプル返信 削除
2018/9/10 (月) 22:09:20 igy
▼ takaさん

taka さん、情報ありがとうございます。

> ほかの暦ソースから自動抽出して検証してみたのですが、間違いがありました。

そして、検証ありがとうございました!

> 祝日は、データベース化したほうが無難。

データベース化したものを用意しつつ、
ソースも修正して、チェックしたい気も・・


[12253] Re4:Googleカレンダーからのパクリ サンプル返信 削除
2018/9/11 (火) 11:50:58 DEKO 〔HomePage
修正しておきました♪

[12254] Re5:Googleカレンダーからのパクリ サンプル返信 削除
2018/9/11 (火) 11:54:03 igy
▼ DEKOさん
> 修正しておきました♪

ありがとうございます!!

[12255] Re5:Googleカレンダーからのパクリ サンプル返信 削除
2018/9/11 (火) 15:12:51 Mr.XRAY
▼ DEKOさん
> 修正しておきました♪

うぉー,ありがとうございます !!
海の日だけ調べましたが,国立天文台と内閣府の記事を読みました.
偉い面倒くさい !!
それこそ,某掲示板の
『読んでみましたが、もう年なので、頭に入りません。』
状態です (笑)

関数を作成したくださった DEKO さんと,チェックしてくださった taka さん
に感謝です.


[12258] IsSpecialHoliday返信 削除
2018/9/11 (火) 19:11:00 taka
▼ DEKOさん
> 修正しておきました♪
お疲れ様です。

新しい暦データが手に入ったので再度検証しました。

1948-2020までの期間(IncDayループで完全比較)

1948年からということなので
1948年は旧法と新法の混在期間なので
下記のデータ以外は
修正を加えた比較用データと完全一致しました。

・1948年の旧法での祝日(1月〜7月)
1948/01/03=元始祭
1948/01/05=新年宴会
1948/02/11=紀元節
1948/03/21=春季皇霊祭
1948/04/03=神武天皇祭
1948/04/29=天長節

・国民の祝日に関する法律は
1948年(昭和23年)7月20日に公布・即日施行されているので、同年のそれより前は旧法。
元日、成人の日、憲法記念日、こどもの日は 1949年から


[12259] Re:IsSpecialHoliday返信 削除
2018/9/11 (火) 19:57:00 Mr.XRAY
▼ takaさん

> 1948年は旧法と新法の混在期間なので
> 下記のデータ以外は
> 修正を加えた比較用データと完全一致しました。


これで 1948年以降の全ての祝日と祝日名ということになりますね.
お疲れ様です.

>元日、成人の日、憲法記念日、こどもの日は 1949年から

へえ〜,そうだったんですね.戦後数年なんですね.

# 戦後といっても「応仁の乱」の戦後ではありません !!
# http://ja.uncyclopedia.info/wiki/%E5%85%88%E3%81%AE%E6%88%A6%E4%BA%89


[12260] Re2:IsSpecialHoliday返信 削除
2018/9/12 (水) 07:36:39 Mr.XRAY
当サイトの同名の記事も更新しました.

[指定した日が祝日かどうかを調べる]
http://mrxray.on.coocan.jp/Delphi/plDateEdit/Hints_Troubles.htm#94


[12264] 2030年までの春分日・秋分日返信 削除
2018/9/13 (木) 01:48:41 taka
2030年までの春分日・秋分日

・西暦2000〜2030 年の春分日・秋分日 - 国立天文台(NAOJ)
  https://www.nao.ac.jp/faq/a0301.html


[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


[12912] TCalendarView、TCalendarPickerでの使用例返信 削除
2019/6/15 (土) 20:39:06 igy
土曜日は青、日曜日や祝日は赤の文字で表示したい場合、

OnDrawDayItemイベントで、

procedure TForm1.CalendarView1DrawDayItem(Sender: TObject;
  DrawParams: TDrawViewInfoParams; CalendarViewViewInfo: TCellItemViewInfo);
var
    S: String;
begin
    if DayOfWeek(CalendarViewViewInfo.Date) = 1 then
        DrawParams.ForegroundColor := clRed;
    if DayOfWeek(CalendarViewViewInfo.Date) = 7 then
        DrawParams.ForegroundColor := clBlue;

    if IsSpecialHoliday(CalendarViewViewInfo.Date, S) then
        DrawParams.ForegroundColor := clRed;
end;

のような感じで、文字の色を変更します。

カレンダー ビューの利用
http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC_%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E5%88%A9%E7%94%A8

# TCalendarView、TCalendarPickerは、Delphi 10.1 Update2で追加されました。


[12914] Re:TCalendarView、TCalendarPickerでの使用例返信 削除
2019/6/15 (土) 20:58:16 Mr.XRAY
▼ igyさん

> のような感じで、文字の色を変更します。

へぇ〜,なるほど.
ありがとうございます.
さてと,どこに書いておこうかな (笑)
 
> カレンダー ビューの利用
> http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC_%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E5%88%A9%E7%94%A8
>
> # TCalendarView、TCalendarPickerは、Delphi 10.1 Update2で追加されました。


進化しているんですね.


[12915] Re2:TCalendarView、TCalendarPickerでの使用例返信 削除
2019/6/15 (土) 21:31:39 igy
▼ Mr.XRAYさん
> > カレンダー ビューの利用
> > http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC_%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E5%88%A9%E7%94%A8
> >
> > # TCalendarView、TCalendarPickerは、Delphi 10.1 Update2で追加されました。
>
> 進化しているんですね.


進化していますが、IDERA Communityでも、

How to add/show "Today button" on TCalendarPicker?
https://community.idera.com/developer-tools/programming-languages/f/c-language/69185/how-to-add-show-today-button-on-tcalendarpicker

挙げられているように、[今日]ボタン がないのが、(少しだけ)難点ですね。

で、↓の TRzDateTimeEdit、TRzCalendar は、なかなか良いかも・・です。



[12913] TRzDateTimeEdit、TRzCalendarでの使用例返信 削除
2019/6/15 (土) 20:54:44 igy
TRzDateTimeEdit、TRzCalendarは、Konopka Signature VCL Controls 6.2.3に含まれており、
GetItパッケージマネージャ−にて無償で入手できます。
(10.3 RioのGetItでは「Bonus KSVC 6.2.3」と表記されてます。)

土曜日は青、日曜日や祝日は赤の文字で表示したい場合、
OnGetDayFormatイベントで文字色を指定します。

  TForm1 = class(TForm)
    RzDateTimeEdit1: TRzDateTimeEdit;
    RzCalendar1: TRzCalendar;

    procedure FormCreate(Sender: TObject);
    procedure RzDateTimeEdit1GetDayFormat(Sender: TObject; DayDate: TDateTime;
      Year, Month, Day: Word; var DayColor, DayFontColor: TColor;
      var DayFontStyle: TFontStyles);
    procedure RzCalendar1GetDayFormat(Sender: TObject; DayDate: TDateTime; Year,
      Month, Day: Word; var DayColor, DayFontColor: TColor;
      var DayFontStyle: TFontStyles);
    procedure RzDateTimeEdit1ViewDateChange(Sender: TObject; ViewDate: TDateTime);
  private
    { Private 宣言 }
    CurrentViewDate: TDateTime;    // RzDateTimeEdit1用
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    with RzDateTimeEdit1 do
    begin
        EditType := etDate;

        CaptionClearBtn := 'クリア';
        CaptionTodayBtn := '今日';
    end;

    with RzCalendar1 do
    begin
        //CaptionClearBtn := 'クリア';
        CaptionTodayBtn := '今日';

        Elements := Elements - [ceClearButton];
    end;

    CurrentViewDate := 0;
end;

// RzDateTimeEdit:OnGetDayFormatイベント
procedure TForm1.RzDateTimeEdit1GetDayFormat(Sender: TObject; DayDate: TDateTime;
  Year, Month, Day: Word; var DayColor, DayFontColor: TColor; var DayFontStyle: TFontStyles);
var
    S: String;
    isSameYMView: Boolean;
begin
    isSameYMView := SameDate(StartOfTheMonth(DayDate), StartOfTheMonth(CurrentViewDate));
    // TRzCalendarのViewDateプロパティに該当するものがないのでViewDateChangeイベントで取得したViewDateで比較

    if (DayOfWeek(DayDate) = 1) or IsSpecialHoliday(DayDate, S) then    // 日曜か祝日
    begin
        DayFontColor := clRed;
        if not isSameYMView then
            DayFontColor := RGB(255, 144, 144);
    end
    else if DayOfWeek(DayDate) = 7 then                                 // 土曜
    begin
        DayFontColor := clBlue;
        if not isSameYMView then
            DayFontColor := RGB(128, 128, 255);
    end;
end;

// RzCalendar:OnGetDayFormatイベント
procedure TForm1.RzCalendar1GetDayFormat(Sender: TObject; DayDate: TDateTime;
  Year, Month, Day: Word; var DayColor, DayFontColor: TColor; var DayFontStyle: TFontStyles);
var
    S: String;
    isSameYMView: Boolean;
begin
    isSameYMView := SameDate(StartOfTheMonth(DayDate), StartOfTheMonth(TRzCalendar(Sender).ViewDate));

    if (DayOfWeek(DayDate) = 1) or IsSpecialHoliday(DayDate, S) then    // 日曜か祝日
    begin
        DayFontColor := clRed;
        if not isSameYMView then
            DayFontColor := RGB(255, 144, 144);
    end
    else if DayOfWeek(DayDate) = 7 then                                 // 土曜
    begin
        DayFontColor := clBlue;
        if not isSameYMView then
            DayFontColor := RGB(128, 128, 255);
    end;
end;

procedure TForm1.RzDateTimeEdit1ViewDateChange(Sender: TObject; ViewDate: TDateTime);
begin
    CurrentViewDate := ViewDate;
end;

TRzCalendarではViewDateプロパティでカレンダーの年月が確認しているのですが、
TRzDateTimeEditにはViewDateプロパティがないので、OnViewDateChangeイベントで取得したViewDateの値でカレンダーの年月を確認しています。

[12916] Re:TRzDateTimeEdit、TRzCalendarでの使用例返信 削除
2019/6/15 (土) 21:44:46 Mr.XRAY
▼ igyさん

> TRzDateTimeEdit、TRzCalendarは、Konopka Signature VCL Controls 6.2.3に含まれており、
> GetItパッケージマネージャ−にて無償で入手できます。
> (10.3 RioのGetItでは「Bonus KSVC 6.2.3」と表記されてます。)


おっ,こいつは便利そうだ !
時刻の入力もまとも (? ) にできる感じですね.


[12917] Re2:TRzDateTimeEdit、TRzCalendarでの使用例返信 削除
2019/6/15 (土) 22:14:05 igy
▼ Mr.XRAYさん
> 時刻の入力もまとも (? ) にできる感じですね.

procedure TForm1.FormCreate(Sender: TObject);
begin
    with RzDateTimeEdit2 do
    begin
        EditType := etTime;

        CaptionAM := '午前';
        CaptionPM := '午後';
        CaptionSet := 'セット';
        HowToUseMsg :=  '左クリックで時(Hour)をセット' + #13#10 +
                        '右クリックで分(Minute)をセット' + #13#10 +
                        '(Ctrl+右クリックで5分刻みでセット)';
    end;
end;

右クリックで分を指定できる仕様を、(職場などで)ユーザーに受け入れられるかは、気になるところです。


[12918] Re3:TRzDateTimeEdit、TRzCalendarでの使用例返信 削除
2019/6/15 (土) 23:27:44 Mr.XRAY
> 右クリックで分を指定できる仕様を、(職場などで)ユーザーに受け入れられるかは、気になるところです。

ハハハッ
「クリック ? 右 ? 左 ?」
と訊く人がいる一方で右クリックには馴染みがない人も多いです.


INCM/CMT
Cyclamen v3.82