なにがおきたか
PowerAppsのキャンバスアプリを使ってつくったシステムで,時刻がずれる人がいました。
確認してみると,その人は海外出張先(オランダ UTC+2)からシステムを利用していて,パソコンのロケール設定,つまり時差が原因でした!
くわしい原因
SharePointリストの見えない内部ではUTCで時刻を扱っています。
そしてSharePointやPowerAppsで表示(読み書き)するときにデバイスのロケールに基づいて,内部で勝手に変換しているのです。
例:
- 表示: 9:00 (日本 UTC+9)
- 内部: 0:00 (UTC±0)
- ずれる人: 前日の22:00 (オランダ UTC-2)
内部はUTCで扱う実装は自然ですが,私のアプリでは「9時(くじ)」に意味があるので,ロケール設定に左右されると困ります。
どうするか
- 案1: ロケール設定を日本で使ってくださいとお願いする
- いちばん手抜き
- 案2: ロケール設定が日本じゃない人はアプリを強制終了してしまう
-
Now() - UTCNow()が9時間でない人はExit() - 海外にいるときでもアプリを使うときはロケールを日本に設定しましょう
- 海外ロケールにしてる人なんてほぼいないという想定
-
- 案3: 修正項を計算する
- ただし実装がめんどうになる
修正項の計算
グローバル変数TIMEZONE_OFFSETを計算して,PowerAppsで時刻をSharePointリストにPatchする際などにDateAdd()する。
TIMEZONE_OFFSET = 9 - (Now() - UTCNow())
修正項の計算例 (9:00 JST)
日本
デバイスのロケールが日本の場合は修正項0です。
そのままSharePointリストに保存されます。
TIMEZONE_OFFSET = 9 - (9:00 - 0:00)
TIMEZONE_OFFSET = 9 - 9
TIMEZONE_OFFSET = 0
- 表示: 9:00 (日本 UTC+9)
- 内部: 0:00 (UTC±0)
オランダ
デバイスのロケールがオランダの場合は修正項11です。
オランダで9:00を入力した場合,修正項の11時間を加算した22:00を保存します。
TIMEZONE_OFFSET = 9 - (23:00 - 0:00)
TIMEZONE_OFFSET = 9 - (-2)
TIMEZONE_OFFSET = 11
- 表示: 22:00 (オランダ UTC-2)
- 内部: 0:00 (UTC±0) ← 同じにそろった!
おわりに
開発者が操作できないところで時差処理をされると困りますが,
じつは操作できる方法があるかもしれません。
もっと良い方法があれば教えていただきたいです。
なかなかレアケースですが参考になれば幸いです。