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のプロパティも保持するので、それらの考慮も実装次第で可能。UNCalendarNotificationTriggerDeviceActivityScheduleなど、Appleが提供するSDKでもスケジュールを扱うAPIはDateComponents形式でパラメーターを受け取るものが多い。
このスクラップは2024/05/12にクローズされました