Closed6
iOSで扱うCalendar/Locale/TimeZoneについて
日付と時刻
- 24時間表示は12時間表記(午前/午後, AM/PM)か24時間表記のデバイス設定をユーザーが設定できる。Locale.hourCycleと対応している。
- 自動設定をオンにすると、デバイスのタイムゾーンが海外旅行などの際に自動で更新される。これはTimeZone.autoupdatingCurrentを使うことで追跡できる。
- 時間帯は自動設定がオフの場合にユーザーがデバイスのタイムゾーンを手動で設定できるフィールド。これが切り替わった場合も同じようにTimeZone.autoupdatingCurrentで対応できる。
言語と地域
- 優先する言語は、アプリのローカライズの優先度を決められる機能。例えば日本語圏ユーザーのプライマリ言語が日本語でフランスの開発者のアプリ(ベース言語がfr)を使う場合、日本語にはローカライズされていないが英語にはローカライズされていることが考えられる。このとき第2言語で英語を指定していると、開発者のベース言語のフランス語ではなく、優先言語として指定した英語のローカライズでアプリが表記されるようになる。Locale.preferredLanguagesに対応している。
- 地域はLocale.regionと対応している。
- 歴法はカレンダーの種類. カレンダーによっては月の日数が変わったりする。Locale.calendarと対応している?
- 週の始まりの曜日はLocale.firstDayOfWeekに対応している。
Localeの基本は{言語+スクリプト+地域}である。スクリプトは日本語でもカタカナ・ひらがな・漢字の3つがあるように、同一言語でも表記バリエーションがある。
Locale:
- 言語: ユーザーの言語を指定する. ローカライズに関連する。
- スクリプト: ある言語での表記バリエーションについて指定する。ローカライズに関連する。
- 地域: ユーザーの地域を指定する。地域に応じた表示書式に関連する。
これら3つを合わせたのがLocaleオブジェクトの基本
let locale = Locale(languageCode: .japanese, script: .katakana, languageRegion: .unitedStates)
print(locale) // ja-Kana_US (fixed ja-Kana_US)
- DateComponentsを保存している
- 途中でユーザーがタイムゾーンを変えた
- アプリのDatePickerで保存しているDateComponentsからDateを作って表示
上記の条件で考えて試してみた。
DateComponentsを軸にすると、生成されるDateはreferenceTimeからの別の経過時間を指すようになるけど(ここでは90000)、TimeZoneを考慮後の現地時間ではDateComponentsの指定要素値レベルで維持されているのがわかる。
- Dateを取り回す: 経過時間の値は維持されるが、タイムゾーンが変わると現地時間で別の日時を指す(=表示される)ことがある
- DateComponentsを取り回す: タイムゾーンを変更した後でDateを生成すると経過時間の値は変わってしまうが、現地時間での日付要素は維持される。
日本時間で18時の18の値をDateComponentsに保持しておくと、タイムゾーンを"America/Denver"に変えたあとにDateを生成しても現地時間で18時を表示してくれる。
Date/DateComponentsに対する考慮の結論
- タイムゾーンが関係ない、ある時間の一時点(=基準時からの経過時間)を表したい場合はDateを保持する。
- ある時間の一時点ではなく、それぞれの日付要素の値を尊重したい場合はDateComponents形式で保持する。CalendarとTimeZoneのプロパティも保持するので、それらの考慮も実装次第で可能。UNCalendarNotificationTriggerやDeviceActivityScheduleなど、Appleが提供するSDKでもスケジュールを扱うAPIはDateComponents形式でパラメーターを受け取るものが多い。
このスクラップは2024/05/12にクローズされました