0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PowerAppsで時差を考慮する

Last updated at Posted at 2025-12-13

なにがおきたか

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) ← 同じにそろった!

おわりに

開発者が操作できないところで時差処理をされると困りますが,
じつは操作できる方法があるかもしれません。
もっと良い方法があれば教えていただきたいです。
なかなかレアケースですが参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?