[Python-ml-jp 5030] Re: 給料日と最終営業日を求める方法

Masaya jack Kato jack @ jk.to
2010年 9月 13日 (月) 17:34:01 JST


鎌土さん、

なるほど、そういう手もありますね。ご指摘ありがとうございます。
時間の点は非同期にすればいいと思います。一時間でズレるものでも
ないですから。
で、取得失敗時のバックアップ用にいまの祝日ファイルを使うように
すればいい感じでしょうかね。
参考にさせていただきます。

鎌土 記良 さんは書きました:
> jackさん
> 
> 鎌土と申します。
> googleのアカウントを会社で取れるようでしたら、日本の祝日カレンダーを登録者しておいて、API叩いてそれをキャッシュさせてもらえばいいんじゃないでしょうか。
> ただ、納品先のセキュリティによっては困難かもしれませんが。スタンドアロンでないことと、若干初期キャッシュ時に時間がかかる問題はあります。
> 
> 他にもカレンダー関連でAPIを公開しているサーバがあればそれを使えばいいような気がするんですが、如何でしょうか。
> 
> 横槍ですいません。
> よろしくお願い致します。
> 
> 
> iPhoneから送信
> 
> On 2010/09/11, at 22:29, Masaya jack Kato <jack @ jk.to> wrote:
> 
>> 十河さん、ありがとうございます。
>>
>> 一応1ファイル版にしたものを吊しておきます。たぶん、2059年くらいまでは
>> 国立天文台のEquinox days に合っていると思います。
>> 変数等をちょっとだけ公開用に書きかえました。
>>
>> http://ns.jk.to/download/payday.py/view
>>
>> はっきりいってそんなにいい実装ではないと思うのですが、
>> ググってもそれっぽいのが発見できなかったので晒します。
>> 一回呼ぶたびにその年の祝日等を再計算して効率わるいです。
>> まぁ、現状で0.1秒もかからないので無視してます。
>> アサイチで一回だけ呼ばれることを想定してますので。
>> # 実際にはHolidays とかはファイルに書かれています。
>>
>> (2010/09/09 14:18), 十河 満 wrote:
>>>  この手の日付の問題は、昔で言えば事務処理計算で良くある問題ですね。
>>> 一般的には、1年間の非営業日や祝祭日等をファイルで持たせて、全システム
>>> 共通で使うことが多いと思います。当然これらを扱う関数(サブルーチン)も
>>> 共通化されています。そして、そのファイルを決められたサイクルで確実に
>>> 更新することで運用されます。極稀に更新し忘れて大事になったこともありました。
>>> 個々のプログラムに組込まれるとメンテし辛いのと、システム全体の品質の問題が
>>> 発生します。一方、不景気になるとIT投資も抑制され、プログラムのライフサ
>>> イクル
>>> も延びるので、10年以上使われる可能性があると思った方が良いかも。
>>> 自分の若い時に書いたプログラムが20年後も動いていてビックリしたこともあり
>>> ました。
>>> 以上、答えになっていないと思うのですが、定年退役SEより。
>>>
>>> (2010/09/09 12:20), Masaya jack Kato wrote:
>>>> jackです。
>>>>
>>>> 表題の通りなんですが、なにかスマートな方法がないかと思って投稿します。
>>>>
>>>> とある会社の給料日は23日です。で、給料日の常として、土日祝日が23日に当る場合は
>>>> 繰上がります。
>>>>
>>>> 最終営業日はその月で「銀行が営業している」一番遅い平日と定義されています。
>>>> なので、12月は30日またはそれより早い最後の平日が最終営業日となります。
>>>>
>>>> 最終営業日は4月の例外処理以外はシンプルなのでまだいいんですが、
>>>> 給料日の23日というのがやっかいです。
>>>> ・祝日が多い
>>>> ・祝日が動く(春分、秋分の日)、しかも正式には閣議決定まで決まらない
>>>>   # 閣議決定は無視して国立天文台が発表する(であろう)日にするしかないですが
>>>> ・祝日法の規定によるシルバーウィーク現象にひっかかる
>>>>   # このとき、秋分の日が23日だと給料日が18日になります。次は2015年。
>>>>
>>>> とりあえず「今日は該当日か?」を返すということで
>>>>
>>>> def isPayday(today=None): # None なら datetime.now()を代入します。
>>>>
>>>> みたいな形で書いてみたのですが、すんごいグダグダなelifだらけのコードになりました。
>>>>
>>>> とりあえず10年も使えれば充分なのですが念の為ということで50年後の2060年
>>>> までの国立天文台が発表するであろう春分、秋分の日の求め方は調べました。
>>>> y を年とした場合、
>>>>
>>>>     ymod = y % 4
>>>>     seday = 20 # Spring Equinox Day
>>>>     aeday = 23 # Autumnal Equinox Day
>>>>     if ymod == 0: aeday = 22
>>>>     elif ymod == 1:
>>>>         if y>  2044: aeday = 22
>>>>     elif ymod == 2:
>>>>         if y<  2023: seday = 21
>>>>     elif ymod == 3:
>>>>         if y<  2056: seday = 21
>>>>
>>>> こんな感じになります。少なくとも2100年にはこのコードはバグるんじゃないか
>>>> と思います(閏年でないので)。
>>>>
>>>> とりあえず10年分ぐらいは動くコードはできたのですが
>>>> (テストデータを10年分くらい手作業で作成(苦笑))、
>>>> なにかスマートな方法ありませんでしょうか。
>>>>
>>>> # ふつーに25日とかならよかったのに……>  給料日
>>> _______________________________________________
>>> Python-ml-jp mailing list
>>> Python-ml-jp @ python.jp
>>> http://www.python.jp/mailman/listinfo/python-ml-jp
>>>
>> _______________________________________________
>> Python-ml-jp mailing list
>> Python-ml-jp @ python.jp
>> http://www.python.jp/mailman/listinfo/python-ml-jp
> _______________________________________________
> Python-ml-jp mailing list
> Python-ml-jp @ python.jp
> http://www.python.jp/mailman/listinfo/python-ml-jp
> 

-- 
Masaya jack Kato



Python-ml-jp メーリングリストの案内