はじめに
Notion Tips の第86回目は Notion API 実行時に数式でタイムゾーンを意識する必要があることを解説していきます。
問題の気づき
私のスプリント・タスクデータベースでは、月曜日にスプリントが切り替わった後に calendar_to_sprint.rb というスクリプトが実行され、今週と来週のタスクが「current」と「next」のスプリントに自動的にセットされるようになっています。今日は祝日で授業がないのですが、今日のタスクに何故か授業のタスクが表示されていました。その際に投げた X のポストがこれです。
今日、祝日なのに授業のタスクが入っていてびっくりした。week_id の Formula の結果で Sprint の配布をしているのだが、8:40 から始まる1限の授業が1週前のスプリントに配置されてしまう。
— hkob|Notion Ambassador (@hkob) 2024年9月16日
WW の計算が GMT のサーバ上で実施されるからか。#Notion #notionapi pic.twitter.com/TaFezN4SNv
もとの数式は以下のようになっています。これは来週を示す 2024-39 という結果になっています。
formatDate(prop("Start date"), "YYYY-WW")
一方、NotionRubyMapping で Notion API として表示した結果は 2024-38 となっています。これは以下の原因によるものです。
- JST (+09:00) : 2024/09/23T08:40:00+09:00
- WW は 39
- GMT (+00:00): 2024/09/22T23:40:00+00:00
- WW は 38
Notion API ではユーザのタイムゾーンの情報がないため、全ての計算は GMT で行われます。そのため、日本時間の 9:00 より前のタスクは前日のタスクになってしまうのです。
Notion API 対策
この week_id というフィールドは基本的にこの calendar_to_sprint.rb のために用意したものであるので、Notion で直接見ることはありません。そこで、GMT オフセットを設定してしまうことにしました。
原因がわかれば対処は簡単。Notion API でしか利用しないものであれば、9時間加算してしまうことにする。日曜日の午後15時以降の Notion 側での描画は翌週になってしまうが、直接見るものではないのでよしとした。
— hkob|Notion Ambassador (@hkob) 2024年9月16日
タイムゾーンの問題は API ではいつも苦労する。#Notion #notionapi pic.twitter.com/Jwsfd7EOrC
見てわかるように Notion API のためだけに 9 時間ずらしています。この結果、日曜日の 15時以降のタスクは Notion ページ上ではずれて表示されます。直接見るデータではないのでよいことにしましょう。必要であれば、表示用のプロパティと Notion API 用のプロパティを分けるといいでしょう。
prop("Start date").dateAdd(9, "hours").formatDate("YYYY-WW")
おわりに
今回は、Notion API でのタイムゾーンの取り扱いについて注意が必要であることを解説しました。NotionRubyMapping では日付検索 filter 設定時にフレームワーク内でタイムゾーンの対処をしています。しかし、数式自体の問題だとフレームワークだけでは対処はできず、Notion API 専用の数式が必要となるようです。