Calendar、Date、Components

日付関連は色々あるのでほんの一例です、自分が使いやすかった記述のメモになります。

Date関数(今日の日付)から年月日等を取得

currentを使用する、currentは端末から読み込むようで暦の設定は出来ない(.gregorianとか)

自分で日付を指定してComponent作成からDateへ

暦を設定してComponent(カレンダーの部品的な)を作る
日付操作をするためにはdate型にしてその変数を指定する、主に.dateで作る

日付操作例

byAddingで操作

タイムゾーンの明示

Date()はUTC時間で生成され、テキストに変換した際のタイムゾーンはデバイスの環境設定で変わるので必要であれば明示する必要がある。

日付の比較

Calendar のユーティリティを使う(推奨)

isDate(_:inSameDayAs:) は同じ暦日の範囲(そのカレンダー・タイムゾーンで見た年/月/日が同じか)を判定してくれるので簡潔で安全です。

startOfDay(for:) を比較する方法

startOfDay(for:) はその日の 00:00 の Date を返すので、瞬間比較でも日だけ比較できます。

付録:表示(print)の見た目について

print(day!) の出力が 2025-11-14 15:00:00 +0000 になるのは Date の標準表示が UTC(+0000)で行われるためです。JST(UTC+9)の 2025-11-15 00:00 が UTC 表記だと 2025-11-14 15:00:00 +0000 に見えるだけなので、怪しいのは表示形式だけで Date 自体は正しいです。

最後に安全上の注意

  • ! での強制アンラップはクラッシュの元。guard let や if let で安全に取り扱うのがおすすめです。
  • 日付比較は常に使うカレンダーとタイムゾーンを意識すること(Calendar.current を使うか、自前で timeZone を合わせる)。

ISO8601DateFormatter()

ISO8601DateFormatter().date(from: String)
戻り値は Date?(Optional<Date>)型です。

つまり:

この date は Date 型なので、Date()(現在時刻)と直接比較できます
ただし注意すべき点がいくつかあります👇

⚠️ よくある落とし穴

① Optionalのまま比較している

date は Date? なので、比較する前にアンラップが必要です。

② タイムゾーンのずれ

ISO8601DateFormatter はデフォルトで UTC(世界標準時) を扱います。
日本時間(JST)とは +9時間 の差があるため、見かけ上「ズレてる」と感じることがあります。

もしアプリで 日本時間ベースで比較したい なら:

③ ISO文字列のフォーマットが不完全

ISO8601DateFormatter は、ISO 8601の完全な形式じゃないと失敗します。
たとえば:

  • ✅ OK: "2025-11-12T13:30:00Z"
  • ✅ OK: "2025-11-12T13:30:00+09:00"
  • ❌ NG: "2025/11/12 13:30"

そんな時は DateFormatter を使ってカスタム書式指定も可能です。

✅ 確実に動作するサンプルコード

コメント

タイトルとURLをコピーしました