LoginSignup
1
0

More than 1 year has passed since last update.

Google Calendar APIのQuick StartをUTC(協定世界時)ではなくてJST(日本標準時)で使う

Posted at

はじめに

最近LINEボットを作成しました。
Googleカレンダーに登録した予定を通知してくれるだけのボットですが、知人や母に使用してもらってます。
LINEボットに関する記事もそのうち書きたいなとは思ってるんですが、今回はGoogleカレンダーのイベントを取得する際にハマった沼について書き留めておきます。

ハマったところ

GitHubにあるサンプルコードの、57行目のあたりです。

quickstart.py
# 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やらなくちゃ。
では。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0