タイムゾーンを越えたテストなど、iOS Simulator のタイムゾーンを変更したいときってありますよね?
さっとググると、MacOSのタイムゾーンを変更しろ!なんて情報がありますけど、MacOS の他のアプリケーションにも影響しそうで積極的にはやりたくありません。
別の方法はあるのでしょうか?
いろいろと調べたところ、結論からいうと、ビルド時の環境変数 TZ を変更することで、ビルドしたアプリ限定でタイムゾーンを変更できるようです。
正確には Simulator のタイムゾーンは変更されないのですが、僕が確認したかった範囲ではこれで十分だったので有用と思いましてまとめました。
手順
まずは、xcode 左上のアプリ名のところを選択して、「Edit Scheme...」を選びます。
次に、、下図のように選択します。
③ のところには、Name に TZ、Value にタイムゾーンを示す文字列を入力します。
Value の指定は、tz database にある Asia/Tokyo といった文字列や、JST, PST のような略語文字列でも扱ってくれるようです。タイムゾーン指定の標準については詳しくないのですが、tz database から選ぶのが無難と思います。
確認方法と注意点
まずは注意点。この方法だと、正確には 、実行しているアプリ内でのみタイムゾーンが変化し、iOS Simulator 内のタイムゾーンは変化しません。
なので、iOS 上部のステータスバーの時刻は変わりません。ですが、アプリ内の時刻は指定したタイムゾーンで処理されています。
確認した方法は次のとおりです。
まずは、なにも指定無し(= MacOS 側のシステム設定)です。システム設定は、Asia/Tokyo です。
適当なところに以下のコードをコピペします。
let today = Date.today()
let df = DateFormatter()
df.dateFormat = "hh:mm Z"
df.timeZone = TimeZone.current
print(today)
print(df.timeZone!)
print(df.string(from: today))
実行すると、以下のようにコンソールに表示されます。日本時間で正しく表示されています。
2020-07-28 03:19:29 +0000
Asia/Tokyo (current)
12:19 +0900
次に、TZ に America/Los_Angeles を設定して実行してみます。
2020-07-28 03:19:55 +0000
America/Los_Angeles (current)
08:19 -0700
適切にタイムゾーンが変更されていることを確認できました。
同様に、ちょっとマイナーな IRST(イラン標準時)を4文字略称で設定してみます。
2020-07-28 03:20:36 +0000
Asia/Tehran (current)
07:50 +0430
こちらも確認することができました。
参考文献
※ この記事は、xcode 11.4.1 で確認しています。

