pco2699’s blog

学んだコード・技術について、保存しておく場所

Date型から強制的に「年月日」以外のデータを切り捨てる

環境

つまづきポイント

Swiftで日付の差分を計算してその間の日数を表示するロジックを書いてたら Date型で時・分が保存されてしまっていて、想定外の日数となっていた!

// 現在日付を取得(例えば 2017/07/12 12:01)
let today_date = Date()
// 期限を取得(例えば 2017/07/22 12:00)
let deadline_date = settings.object(forKey: "deadline_date") as? Date
    
// 現在の残り日数を計算
var deadline_days_now = calendar?.dateComponents([.day], from: today_date, to: deadline_date).day
// ->日付だけ計算すると10日のはずだけど、時・分が保存されてしまっていて9日になってしまう!

解決方法

一旦、DateからDateComponentsにしてDateに戻す関数を作成して強制的に切り捨てた

// Dateから年日月を抽出する関数
func roundDate(_ date: Date, calendar cal: Calendar) -> Date {
  return cal.date(from: DateComponents(year: cal.component(.year, from: date), month: cal.component(.month, from: date), day: cal.component(.day, from: date)))!
}

// 現在日付を取得(例えば 2017/07/12 12:01)
let today_date = Date()
// 期限を取得(例えば 2017/07/22 12:00)
let deadline_date = settings.object(forKey: "deadline_date") as? Date
// カレンダーを取得
let  calendar = Calendar(identifier: .gregorian)

// today_dateから年月日のみ抽出する -> 2017/07/12となる
let today_date_rounded =  roundDate(today_date!, calendar: calendar!)
// deadline_dateから年月日のみ抽出する -> 2017/07/22となる
let deadline_date_rounded =  roundDate(deadline_date!, calendar: calendar!)


// 現在の残り日数を計算
var deadline_days_now = calendar?.dateComponents([.day], from: today_date_rounded, to: deadline_date_rounded).day
// ->時・分が保存されてないので正しく計算されて10日になる