🦑

Azure Functions Cosmos DB Trigger で日時を扱うときは要注意

2021/04/28に公開

Azure Functionsではさまざまなトリガーを使うことができます。
その中にCosmos DB Triggerというものがあります。
このトリガーが動いたときに、CosmosDBのデータがそのままAzure Functionsに連携されます。
と思っていたのですが、ISO 8601形式で日時を文字列で入れると勝手にUTCに変換されるようです。
いつの間にか時間が9時間戻っていて、超焦りました。

実際にやってみる

  1. 適当に、CosmosDBとAzure Functionsをつくります。
    functionsのコードは面倒なので初期テンプレそのままでOK
module.exports = async function (context, documents) {
    if (!!documents && documents.length > 0) {
        context.log('Document Id: ', documents[0].id);
    }
}
  1. CosmosDBにidを適当なISO日時にしてデータを作ります
{
    "id": "2021-04-28T00:00:00+09:00",
}
  1. Azure FunctionsのLogを見ます
Document Id: 04/27/2021 15:00:00

はい。時間が9時間変わっています。
というか、フォーマットが変わっています。
日付フォーマットの文字列だと勝手に変換してくるようです。

ローカルで動かしてみる

Azure Functionsはローカルデバッグ用にAzure Functions Core Toolsが提供されています。
そちらを使って動かしてみます。

Document Id:  04/28/2021 00:00:00

結果が違う、、、

結論:よく分からん

DBに格納した情報を勝手に変換されるのは困こまります。文字列からTimeZoneの情報消えてるし。
そしてそれ以上のローカルデバッグとクラウドで実行結果が違うのが本当に困ります。こんなのバグしか産まない。
実行環境のTimeZone変えれば、それに併せて取得できる値も変わるのかなと思い環境変数WEBSITE_TIME_ZONEを設定してみたのですが、結果は変わらずでした。

いい対処法ご存知の方がいらっしゃれば教えて下さい。

Discussion