はじめに
この記事を書いたところ、
@yugoes1021 さんより「DateTime.LocalNow() は Power BI Service 上では UTC なので、ご注意を」
とご指摘をもらい、その後アドバイスももらいながら記事内の Power Query を修正しました。
結論
日時はUTCでとってきてから、タイムゾーンをあわせるのが安全。
today = DateTimeZone.SwitchZone(DateTimeZone.UtcNow(),9)
↓ ここから検証コーナー
なにが間違っていたか
当初、Power Query のカレンダーテーブルでは 「今日」 はtoday
変数を
today = DateTime.Date(DateTimeZone.LocalNow())
と定義していました。
このtoday
をもとにして各カラムの計算をしていっていました。
手元のPower BI Desktop 環境でチェックしたときには正しい日時がとれていたと思っていました。
検証
下記4つの関数をPower BI Desktop と Power BI Service で評価がどうなるか確かめます。
DateTime.LocalNow()
DateTimeZone.LocalNow()
DateTimeZone.UtcNow()
DateTimeZone.SwitchZone(DateTimeZone.UtcNow(),9)
Power BI Desktop
2022/01/29 20:20 頃に作業しています。
DateTime.LocalNow()
DateTimeZone.LocalNow()
はともに今の日時を表示。
DateTimeZone.UtcNow()
こちらは(当たり前ですが)UTCを表示。
DateTimeZone.SwitchZone(DateTimeZone.UtcNow(),9)
こちらも正しい日時を表示。
Power BI Service
このレポートを Power BI Service にアップして、データセットを更新します。
すると・・
DateTime.LocalNow()
DateTimeZone.LocalNow()
DateTimeZone.UtcNow()
この3つの関数はすべてUTCを表示。
DateTimeZone.SwitchZone(DateTimeZone.UtcNow(),9)
UTCをとってきてから、タイムゾーンをあわせたものだけ、正しい日時を表示しています。
Power BI ServiceのタイムゾーンはUTC
Power BI Desktop で DateTime.LocalNow()
などのローカルタイムを取得すると、
自動的に日本のタイムゾーンで取得される。
そのレポートをそのままPower BI Service にUPすると、クラウドサービス(Power BI Service)側のタイムゾーンはUTCなので、期待している時間が取得できない。
日時を取得するときは明示的にUTCを取得して、日本のタイムゾーンに合わせてあげることが大事。
まとめ
日時を定義するときは明示的にUTCのタイムゾーンを取得→タイムゾーン変換するのが安全!
クラウドサービス(Power BI Service)のローカルタイムゾーンはUTC!