[iOS 8] NSDate の「秒」を切り捨てる方法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「秒」は要らない

NSDate の「秒」を消したい時ってありますよね。

今回は NSDate から「秒」のみを切り捨て、新たな NSDate を生成する方法を説明します。

背景

UIDatePicker を使っていたところ、UI 上は「日付」と「時分」までしか無いのに UIDatePicker が持つ date プロパティにはしっかり「秒」まで保持されていることが発覚しました。
よって、この不要な「秒」を消そうと思います。

方法

  1. 対象の NSDate から NSCalendar を利用して NSDateComponents を取得する
  2. 取得した NSDateComponents から NSCalendar を利用して目的の NSDate を生成する

サンプルコード

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var datePicker: UIDatePicker!

    @IBAction func outputButtonTapped(sender: AnyObject) {

        // カレンダーを取得
        let calendar = NSCalendar.currentCalendar()

        // NSDateComponents 取得時に渡す flag を設定。年号/年/月/日/時/分とする(秒は含めない)。
        let unitFlags: NSCalendarUnit = .CalendarUnitEra | .CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay | .CalendarUnitHour | .CalendarUnitMinute

        // 対象の NSDate から NSDateComponents を取得
        let dateComponents = calendar.components(unitFlags, fromDate: datePicker.date)

        // NSDateComponents から NSDate を生成
        if let date = calendar.dateFromComponents(dateComponents) {
            println(date)           // 「秒」を切り捨てた NSDate
        }

        println(datePicker.date)    // 「秒」が未加工の NSDate
    }
}

追記

年号(CalendarUnitEra)は、iOS のカレンダーを和暦に設定している時に発生しうる不具合を防止するために含めています。
詳しくはこちらの記事を御覧ください。
akuraru さん、コメントありがとうございます。

実行画面

roundDownSecond1

実行結果

2014-11-13 14:50:00 +0000  // 「秒」を切り捨てた NSDate
2014-11-13 14:50:56 +0000  // 「秒」が未加工の NSDate

まとめ

NSDate の加工には NSCalendar を使いましょう。