iCalendarはカレンダーアプリなどで使われるスケジュールデータの標準フォーマット。
iCalendarファイルを使ってGoogleカレンダーやOutlookなどのアプリにスケジュールをインポートすることもできる。
iCalendarファイルは単純なテキストファイルなので、その気になれば一行一行書き出す処理を書いて作ることもできそう。
PythonでiCalendarファイルを読み書きできるライブラリがあるのでこれを使ってみる。
クイックスタートを見ながら試してみる。
まずはファイルの書き出しから。
ics_write.py
from ics import Calendar, Event
import arrow
# カレンダーの生成
cal = Calendar()
cal.creator = 'Me' # 作成者
# イベントの生成
event1 = Event()
event1.name = "A社と打ち合わせ" # タイトル
event1.begin = arrow.get("2021-11-08 12:00:00" ,"YYYY-MM-DD HH:mm:ss").replace(tzinfo="Asia/Tokyo") # 開始
event1.end = arrow.get("2021-11-08 13:00:00" ,"YYYY-MM-DD HH:mm:ss").replace(tzinfo="Asia/Tokyo") # 終了
event1.description = '○○について\n××について' # 説明
cal.events.add(event1) # カレンダーにイベント追加
event2 = Event()
event2.name = "有給休暇"
event2.begin = arrow.get("2021-11-10 00:00:01" ,"YYYY-MM-DD HH:mm:ss").replace(tzinfo="Asia/Tokyo")
event2.end = arrow.get("2021-11-11 23:59:59" ,"YYYY-MM-DD HH:mm:ss").replace(tzinfo="Asia/Tokyo")
cal.events.add(event2)
print(cal.events)
with open('my.ics', 'w', encoding='utf-8') as f:
f.write(str(cal))
注意点としてそのまま日時をセットするとUTCで扱われるのでタイムゾーンを指定している。
python ics_write.py
{<Event '有給休暇' begin:2021-11-10T00:00:01+09:00 end:2021-11-11T23:59:59+09:00>, <Event 'A社と打ち合わせ' begin:2021-11-08T12:00:00+09:00 end:2021-11-08T13:00:00+09:00>}
出力されたファイル。
my.ics
BEGIN:VCALENDAR
VERSION:2.0
PRODID:Me
BEGIN:VEVENT
DTEND:20211111T145959Z
DTSTART:20211109T150001Z
SUMMARY:有給休暇
UID:f95dbfd9-5b65-4feb-93d9-8fb85221e14e@f95d.org
END:VEVENT
BEGIN:VEVENT
DESCRIPTION:○○について\n××について
DTEND:20211108T040000Z
DTSTART:20211108T030000Z
SUMMARY:A社と打ち合わせ
UID:529095df-3716-4f78-ada7-485cbf1456a7@5290.org
END:VEVENT
END:VCALENDAR
Googleカレンダーに取り込んでみるとちゃんと予定が反映されている。
次にファイルの読み込み。
ics_read.py
from ics import Calendar
with open('my.ics', 'r', encoding='utf-8') as f:
ics_str = f.read()
cal = Calendar(ics_str)
print(cal.events)
python ics_read.py
{<Event '有給休暇' begin:2021-11-09T15:00:01+00:00 end:2021-11-11T14:59:59+00:00>, <Event 'A社と打ち合わせ' begin:2021-11-08T03:00:00+00:00 end:2021-11-08T04:00:00+00:00>}
読み込み時もUTCになってしまうのでそこのケアが必要。
その他細かいライブラリの仕様も公式ドキュメントに書かれてる。