UIDatePicker减去确切时间 - Swift

时间:2014-11-09 00:25:29

标签: ios swift nsdate nsdatepicker

我正在制作一个闹钟,它会告诉你你有多少小时和几分钟的睡眠时间。我设置了UIDatePicker,用户选择他们想要醒来的时间。它还告诉了第二个确切的时间。我坚持的部分是他们将要睡多少小时。我试过基本上从UIDatePicker中减去确切的时间。如果它们都在AM中,这就有效。例如,如果用户想要在上午10:30醒来并且是上午9:30,那么您所要做的就是从9:30减去10:30以获得1小时。我很快意识到,如果他们是不同的时间,这将无法工作,例如上午或下午。

我如何从UIDatePicker获得时间

func handler(sender: UIDatePicker) {
        var timeFormatter = NSDateFormatter()
        timeFormatter.timeStyle = NSDateFormatterStyle.ShortStyle

        var strDate = timeFormatter.stringFromDate(theDatePicker.date)


    }
theDatePicker.addTarget(self, action: Selector("handler:"), forControlEvents: UIControlEvents.ValueChanged)

我如何得到确切的时间

var date = NSDate()
var outputFormat = NSDateFormatter()
outputFormat.locale = NSLocale(localeIdentifier:"en_US")
outputFormat.dateFormat = "HH:mm:ss"
timeLabel.text = (outputFormat.stringFromDate(date))
var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("getTime"), userInfo: nil, repeats: true)

我的问题:

如何从准确的时间中减去UIDatePicker以获得用户获得的睡眠时间?

theff

2 个答案:

答案 0 :(得分:12)

您可以使用NSCalendar方法components:fromDate:toDate:options:,例如:

@IBAction func valueChangedForPicker(sender: UIDatePicker) {
    let now = NSDate()
    let wakeUpTime = sender.date

    let calendar = NSCalendar.currentCalendar()
    let components = calendar.components(.HourCalendarUnit | .MinuteCalendarUnit | .SecondCalendarUnit, fromDate: now, toDate: wakeUpTime, options: nil)

    println(String(format: "%02d:%02d:%02d", components.hour, components.minute, components.second))
}

如果您收到负值,那是因为fromDate不在toDate之前。在这种情况下,如果您仅在时间内处理NSDatePicker,则可能需要调整wakeUpTime的时间以确保它在将来。

var wakeUpTime = datePicker.date

if wakeUpTime.compare(now) == .OrderedAscending {
    wakeUpTime = calendar.dateByAddingUnit(.DayCalendarUnit, value: 1, toDate: wakeUpTime, options: nil)!
}

答案 1 :(得分:5)

以下是Swift游乐场的一个例子:

// Setting up a date since I don't have a UIDatePicker
let dateString = "2014-11-12 07:25"
let dateFormatter: NSDateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd hh:mm"

var wakeupTime: NSDate = dateFormatter.dateFromString(dateString)!
// var wakeupTime: NSDate = theDatePicker.date

let fromDate = NSDate()
let gregorianCalendar: NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)!
let flags: NSCalendarUnit = .HourCalendarUnit | .MinuteCalendarUnit

let components = gregorianCalendar.components(flags, fromDate: fromDate, toDate: wakeupTime, options: NSCalendarOptions(0))

println("\(components.hour) hours, \(components.minute) minutes")