🦑
Azure Functions Cosmos DB Trigger で日時を扱うときは要注意
Azure Functionsではさまざまなトリガーを使うことができます。
その中にCosmos DB Triggerというものがあります。
このトリガーが動いたときに、CosmosDBのデータがそのままAzure Functionsに連携されます。
と思っていたのですが、ISO 8601形式で日時を文字列で入れると勝手にUTCに変換されるようです。
いつの間にか時間が9時間戻っていて、超焦りました。
実際にやってみる
- 適当に、CosmosDBとAzure Functionsをつくります。
functionsのコードは面倒なので初期テンプレそのままでOK
module.exports = async function (context, documents) {
if (!!documents && documents.length > 0) {
context.log('Document Id: ', documents[0].id);
}
}
- CosmosDBにidを適当なISO日時にしてデータを作ります
{
"id": "2021-04-28T00:00:00+09:00",
}
- 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