5

我正在制作一个闹钟,它会告诉你你睡了多少小时和几分钟。我设置了一个UIDatePicker用户选择他们想醒来的时间。它还告诉精确的时间到秒。我坚持的部分是他们将获得多少小时的睡眠。我试着基本上从UIDatePicker. 如果他们都在上午,这很有效。例如,如果用户想在上午 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从确切时间中减去用户睡眠时间?

盗贼

4

2 回答 2

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))
}

如果你得到负值,那是因为fromDateis not before toDate。在这种情况下,如果您NSDatePicker只处理时间,您可能需要调整时间wakeUpTime以确保它在未来。

var wakeUpTime = datePicker.date

if wakeUpTime.compare(now) == .OrderedAscending {
    wakeUpTime = calendar.dateByAddingUnit(.DayCalendarUnit, value: 1, toDate: wakeUpTime, options: nil)!
}
于 2014-11-11T02:10:35.500 回答
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")
于 2014-11-12T08:31:19.763 回答