Notion API における数式のタイムゾーン対応: Notion Tips (86)

はじめに

Notion Tips の第86回目は Notion API 実行時に数式でタイムゾーンを意識する必要があることを解説していきます。

問題の気づき

私のスプリント・タスクデータベースでは、月曜日にスプリントが切り替わった後に calendar_to_sprint.rb というスクリプトが実行され、今週と来週のタスクが「current」と「next」のスプリントに自動的にセットされるようになっています。今日は祝日で授業がないのですが、今日のタスクに何故か授業のタスクが表示されていました。その際に投げた X のポストがこれです。

もとの数式は以下のようになっています。これは来週を示す 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 ページ上ではずれて表示されます。直接見るデータではないのでよいことにしましょう。必要であれば、表示用のプロパティと Notion API 用のプロパティを分けるといいでしょう。

prop("Start date").dateAdd(9, "hours").formatDate("YYYY-WW")

おわりに

今回は、Notion API でのタイムゾーンの取り扱いについて注意が必要であることを解説しました。NotionRubyMapping では日付検索 filter 設定時にフレームワーク内でタイムゾーンの対処をしています。しかし、数式自体の問題だとフレームワークだけでは対処はできず、Notion API 専用の数式が必要となるようです。