日付関連は色々あるのでほんの一例です、自分が使いやすかった記述のメモになります。
Date関数(今日の日付)から年月日等を取得
currentを使用する、currentは端末から読み込むようで暦の設定は出来ない(.gregorianとか)
|
1 2 3 4 5 6 7 |
let a = Calendar.current.component(.year, from: Date()) let b = Calendar.current.component(.month, from: Date()) let c = Calendar.current.component(.day, from: Date()) let d = Calendar.current.component(.hour, from: Date()) let e = Calendar.current.component(.minute, from: Date()) let f = Calendar.current.component(.second, from: Date()) let g = Calendar.current.component(.weekday, from: Date()) //曜日をintで取得 1=日曜日 7 =土曜日 |
自分で日付を指定してComponent作成からDateへ
暦を設定してComponent(カレンダーの部品的な)を作る
日付操作をするためにはdate型にしてその変数を指定する、主に.dateで作る
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
let a = Calendar(identifier: .gregorian) //グレゴリオ暦 let b = Calendar(identifier: .japanese) //和暦 let c = a.date(from: DateComponents(year: 2025, month: 3, day: 31) //2025年03月31日の【date型】が c に入る //↑を分けて書く(ex1~2) let ex1 = DateComponents(year: 2025, month: 5, day: 4) let ex2 = Calendar.current.date(from: ex1)! let d = a.component(.day, from: c ?? nil ?? Date()) //.day指定なので日にちを取得できる c で作った31日がint型で入る let e = a.range(of: .day, in: month, for: c)!.count //c の日にちの数、(最大日にち数) let f = a.component(.weekOfMonth, from: c) //c の週番号を取得できる 6 がintで入る、月初なら1 let g = a.component(.weekOfYear, from: c) //年初から数えて第何週目なのかを取得できる 14 |
日付操作例
byAddingで操作
|
1 2 3 4 5 6 7 |
//加算 let a = Calendar.current.date(byAdding: .year, value: 1, to: Date()) //今の日付から一年足す let b = Calendar.current.date(byAdding: .day, value: 2, to: Date()) //二日足す let b = Calendar.current.date(byAdding: .hour, value: 3, to: Date()) //三時間足す //減算 valueでマイナスするだけ let e = Calendar.current.date(byAdding: .minute, value: -4, to: Date()) //四分引く |
タイムゾーンの明示
Date()はUTC時間で生成され、テキストに変換した際のタイムゾーンはデバイスの環境設定で変わるので必要であれば明示する必要がある。
|
1 2 3 4 5 |
let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" dateFormatter.timeZone = TimeZone(identifier: "Asia/Tokyo") let formattedDate = dateFormatter.string(from: Date()) print(formattedDate) |
日付の比較
Calendar のユーティリティを使う(推奨)
|
1 2 3 4 5 6 7 8 9 10 11 |
func conDay() { var calendar = Calendar(identifier: .gregorian) calendar.timeZone = TimeZone(identifier: "Asia/Tokyo")! // 明示的にタイムゾーンを合わせたいなら let day = calendar.date(from: DateComponents(year: 2025, month: 11, day: 15))! if calendar.isDate(day, inSameDayAs: Date()) { print(1) } else { print(0) } } |
isDate(_:inSameDayAs:) は同じ暦日の範囲(そのカレンダー・タイムゾーンで見た年/月/日が同じか)を判定してくれるので簡潔で安全です。
startOfDay(for:) を比較する方法
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
func conDay2() { var calendar = Calendar(identifier: .gregorian) calendar.timeZone = TimeZone(identifier: "Asia/Tokyo")! guard let day = calendar.date(from: DateComponents(year: 2025, month: 11, day: 15)) else { return } let startOfTarget = calendar.startOfDay(for: day) let startOfNow = calendar.startOfDay(for: Date()) if startOfTarget == startOfNow { print(1) } else { print(0) } } |
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>)型です。
つまり:
|
1 2 |
let formatter = ISO8601DateFormatter() let date = formatter.date(from: "2025-11-12T13:30:00Z") // <- Date? 型 |
この date は Date 型なので、Date()(現在時刻)と直接比較できます。
ただし注意すべき点がいくつかあります👇
⚠️ よくある落とし穴
① Optionalのまま比較している
date は Date? なので、比較する前にアンラップが必要です。
|
1 2 3 4 5 6 7 8 9 |
if let targetDate = formatter.date(from: "2025-11-12T13:30:00Z") { if targetDate < Date() { print("過去の日付です") } else { print("未来の日付です") } } else { print("パースに失敗しました") } |
② タイムゾーンのずれ
ISO8601DateFormatter はデフォルトで UTC(世界標準時) を扱います。
日本時間(JST)とは +9時間 の差があるため、見かけ上「ズレてる」と感じることがあります。
もしアプリで 日本時間ベースで比較したい なら:
|
1 2 3 4 5 6 |
let formatter = ISO8601DateFormatter() formatter.timeZone = TimeZone.current // 現在のタイムゾーン(例: JST) if let targetDate = formatter.date(from: "2025-11-12T13:30:00Z") { print(targetDate) // JST基準で処理 } |
③ 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 を使ってカスタム書式指定も可能です。
✅ 確実に動作するサンプルコード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import Foundation let formatter = ISO8601DateFormatter() formatter.timeZone = TimeZone.current // JST基準にしたい場合 let isoString = "2025-11-12T13:30:00Z" if let targetDate = formatter.date(from: isoString) { let now = Date() if targetDate < now { print("過去の日付です") } else { print("未来の日付です") } } else { print("日付の変換に失敗しました") } |

コメント