TimeZoneはタイムゾーン(標準時間帯)情報を保持する構造体です。
タイムゾーンはある地域での標準時間を表す指標で、GMT(グリニッジ標準時)との時差で表します。
日本の標準時間である日本標準時(JST)はGMT+9時間で定義されています。
環境
この記事の情報は次のバージョンで動作確認しています。
【Swift】5.2
【iOS】13.4
【macOS】Catalina バージョン 10.15.4
現在のタイムゾーン情報の取得
iOSでは使用している端末の位置情報により自動的にタイムゾーンが設定されますので、通常は特に意識する必要はありません。
Swiftで現在のタイムゾーン情報を取得するには次のようにします。
1 2 3 4 5 6 |
/// 現在システムが使用中のタイムゾーン情報を取得 let timezone = TimeZone.current print(timezone) // "Asia/Tokyo (current)” |
タイムゾーン識別子の取得
タイムゾーン識別子とはタイムゾーンを識別する為の地政学的地域識別子です。
String型で"地域名/都市名"の書式で表されます。
日本時間のタイムゾーン識別子は”Asia/Tokyo”です。
1 2 3 4 5 6 7 8 |
let timezone = TimeZone.current /// タイムゾーン識別子を取得 let timezoneId = timezone.identifier print(timezoneId) // “Asia/Tokyo” |
特定日の時差を取得する
現時点の時差を秒数で取得するには次のようにします。
1 2 3 4 5 6 7 8 9 |
let timezone = TimeZone.current /// 日付の時差を秒で取得 /// 引数が無しの場合は現時点の時差を返す Let tmSeconds = timezone.secondsFromGMT() print(tmSeconds) // 32400 (=9時間) |
引数に特定日付を指定すると該当日の時差が取得できます。
サマータイムを採用している地域では、日付によって時差が変わる為、このような仕組みがあります。
日本も過去にサマータイムが実施されていた時期があり、その時の日付で確認すると時差が通常とは異なります。
1 2 3 4 5 6 7 8 9 10 11 12 |
let timezone = TimeZone.current /// 1951/5/7(日本で過去にサマータイムが実施されていた日)を示すDate構造体を生成 let calendar = Calendar(identifier: .gregorian) let date = calendar.date(from: DateComponents(year: 1951, month: 5, day: 7)) /// 該当日の時差を秒で取得 let tmSeconds = timezone.secondsFromGMT(for: date!) print(tmSeconds) // 36000 (= 10時間) |
TimeZone構造体の生成
以下に示す方法で、特定のタイムゾーンを示すTimeZone構造体が生成可能です。
これらのTimeZone構造体は、あくまでプログラム上の日時処理での使用を目的としており、使用している端末のタイムゾーンは変更できません。
タイムゾーン識別子での生成
イニシャライザでタイムゾーン識別子を指定して、特定のTimeZone構造体を生成できます。
1 2 3 4 5 6 |
/// タイムゾーン識別子を指定して生成 let timezone = TimeZone(identifier: "America/New_York") print(timezone!) // America/New_York (fixed) |
指定可能なタイムゾーン識別子は、次の方法で取得可能です。
1 2 3 4 5 6 |
/// 使用可能なタイムゾーン識別子一覧の取得 let identifiers = TimeZone.knownTimeZoneIdentifiers print(identifiers) // ["Africa/Abidjan", "Africa/Accra" ・・・ ] |
タイムゾーン識別子(略称)での生成
一部のタイムゾーン識別子は正式名称の代わりに略称の指定が可能です。
1 2 3 4 5 6 |
/// タイムゾーン識別子(略称)を指定して生成 let timezone = TimeZone(identifier: "JST") print(timezone!) // JST (fixed) |
使用可能な略称一覧は、次の方法で取得可能です。
1 2 3 4 5 6 |
/// 利用可能なタイムゾーン略称と識別子のマッピングリスト取得 let abbreviations = TimeZone.abbreviationDictionary print(abbreviations) // ["HST": "Pacific/Honolulu", "AKST": "America/Juneau", ・・・ ] |
時差を秒数で指定して生成
GMT(グリニッジ標準時)からの時差を秒数で指定して生成します。
この方式で生成したTimeZone構造体は、前途の2つの生成方法と異なり、その地域のサマータイムが考慮されませんので注意が必要です。
1 2 3 4 5 6 |
/// GMTからの時差(秒数)で指定 let timezone = TimeZone(secondsFromGMT: 9 * 60 * 60) print(timezone!) // GMT+0900 (fixed) |
iOS端末でのタイムゾーン設定
iOSでは使用している端末の位置情報により自動的にタイムゾーンが設定されるので、通常は特に意識する必要はありません。
タイムゾーンの確認方法
[設定]→[一般]→[日付と時刻] で現在設定されているタイムゾーンが確認できます。
[時間帯]に表示されている地域のタイムゾーンが現在設定されています。
タイムゾーンの手動設定
先の画面で[自動設定]をオフにすると、時間帯が変更可能になります。
時間帯選択画面で検索窓に国名や都市名を入力すると、該当するタイムゾーンの一覧が表示されますので、そこから選択します。