はじめに
最近LINEボットを作成しました。
Googleカレンダーに登録した予定を通知してくれるだけのボットですが、知人や母に使用してもらってます。
LINEボットに関する記事もそのうち書きたいなとは思ってるんですが、今回はGoogleカレンダーのイベントを取得する際にハマった沼について書き留めておきます。
ハマったところ
GitHubにあるサンプルコードの、57行目のあたりです。
# Call the Calendar API
now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
# nowは2022-02-04T23:59:59.999999Z って感じになります。
nowの使いみちですが、APIを叩く際にtimeMin=now
としてやることで、何時以降の予定を取るか指定できるみたいです。
ちなみに何時までかを指定するのはtimeMax
みたい。
こうしてあげると、現在時刻以降の予定だけを取得できるんですよね。
何が問題だったか
まずこの日時の記法がわかりませんでした。
とりあえずコード的に何をやっているのかはわかります。
datetime
を使用してUTC(協定世界時)を取得し、それをISO(国際標準)形式の文字列に変換し、最後にZをつけてる。
ですが、最後のZがよくわかりません。
しかもこのままだとtimeMin
が協定世界時の時刻になっちゃいますよね。
APIの仕様では、取得するカレンダーのTimeZoneは、引数で指定しない限りは元のカレンダーのTimeZoneになります。
なので、これだとおかしなことになる気がします。
日本標準時と協定世界時の9時間分のズレが起きてしまうような気がする。
(ちなみにここが原因のバグを修正するだけで10回くらいgit push
やり直してます。)
どうしたらよかったか
ここだけ見たら解決します↓
**UTCではなくローカルタイムを取得するようにして、最後のZを日本標準時を表すものに置き換えればOKです。**多分。
変更後のコードは以下の通り。
# Call the Calendar API
now = datetime.datetime.now().isoformat() + '+09:00' # '+09:00' indicates JST time.
# nowは2022-02-04T23:59:59.999999+09:00 って感じになります。
意外と単純ですね。
ちなみに私はZの意味に行き着くまで、なんとかUTCのまま時刻をずらして対応できないかと四苦八苦してました。アホですね。
注意なんですが、now()
だとローカルタイムを取得するようになるはずなので、Herokuとかにデプロイする際はリモートのTimeZoneにも気をつけないといけないです。
今回はHerokuのTimeZoneを変更する方法は割愛しますが、調べればすぐ出てくると思います。
Zはなんだった?
ZはどうもZulu Timeの略らしいです。
意味としてはUTCと全く同じ。
UTC = GMT = Zulu Timeなんだとか。
へー。雑学ぅ〜って感じですね。
おわりに
やっぱり英語の勉強が必要かな。
公式のドキュメントもっとしっかり読めたらきっと楽になる。
TOEICやらなくちゃ。
では。
参考