2013年4月7日日曜日

スタンドアローンで動作する祝日判定スクリプト

タイトルどおりなんですが、仕事で必要なので作ってみました。(ついでに社内のレポートもあったので)。
でも、最近仕事が忙しくて、悲しいかな業務時間に作業してないので、せっかくなのでブログにも置いときます。
社内のレポートは業務時間を使ってもいいことになっているので、有難い制度なんですけどねー。

やりたいこと


日本の祝日を判定したい

1.元データ


スタンドアローンということで、何らかの元データをローカルに保持しないといかんわけで、今回はGoogle カレンダーのAPIを利用しました。

今回利用したXMLリクエスト


http://www.google.com/calendar/feeds/outid3el0qkcrsuf89fltf7a4qbacgt9@import.calendar.google.com/public/full-noattendees?start-min=2013-01-01&start-max=2013-12-31

リクエストパラメータの意味


詳細は、Google Calendar API v2 Atom Referenceを。























outid3el0qkcrsuf89fltf7a4qbacgt9@import.calendar.google.com比較的信頼度が高いとされる、mozillaプロジェクトの祝日一覧(mozzila Calendar Project)
 full-noattendees full版からgg:whoを抜いたもの(今回は不要なので)
 start-min=2013-01-01 期間の始まり
start-max=2014-01-31 期間の終わり

2.実際のコード


[python]
#!/usr/bin/env python

from xml.dom.minidom import parse
import sys
import re

def get_parse(fileName):
try:
obj = parse(fileName)
except IOError:
obj = 0

return obj

def get_arg2(arg2):
pattern = re.compile("^\d{4}-\d{2}-\d{2}$")
matched = pattern.search(arg2)

if matched:
argDate = arg2
else:
argDate = 0

return argDate


def main():
fileName=sys.argv[1]
obj = get_parse(fileName)

if obj == 0:
print "file not found"
return 1

argDate = get_arg2(sys.argv[2])

if argDate == 0:
print "argument is unjust. ex)2013-01-01"
return 1

obj_list = obj.getElementsByTagName("gd:when")

for i in obj_list:
if argDate == i.getAttribute("startTime"):
return 0

print "unmatch holiday"
return 2


if __name__=='__main__':
sys.exit(main())
[/python]

3.ざっくり仕様



  • 第一引数に元xmlのファイルパス

  • 第二引数に確認したい日付をyyyy-MM-ddにて渡す

  • 祝日であれば、0、祝日でない場合は2、その他のエラーは1を返す


4.動作イメージ


[bash]
shase$ ./holidayCheck.py japanHoriday.xml 2013-10-15
unmatch holiday
shase$ ./holidayCheck.py japanHoriday.xml 2013-05-05
shase$ echo $?
0
[/bash]

0 件のコメント:

コメントを投稿