UIDatePicker less la hora exacta – Swift

Estoy haciendo un despertador donde te dirá cuántas horas y minutos de sueño tienes. UIDatePicker un UIDatePicker donde el usuario elige a qué hora quieren despertar. También le dice al momento exacto al segundo. La parte en la que estoy atrapado es cuántas horas de sueño van a recibir. Intenté básicamente restar la hora exacta del UIDatePicker . Esto funcionó si ambos estaban en la mañana. Por ejemplo, si el usuario quería despertarse a las 10:30 AM y son las 9:30 AM, todo lo que tiene que hacer es restar 10:30 a partir de las 9:30 a 1 hora. Pronto me di count de que esto no funcionaría si fueran diferentes times de días, por ejemplo, AM o PM.

Cómo obtuve el time de 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) 

Cómo obtuve la hora exacta

 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) 

Mi pregunta:

¿Cómo restar el UIDatePicker de la hora exacta para get las horas de sueño que el usuario está recibiendo?

theff

Aquí hay un ejemplo de un parque infantil 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") 

Puede usar los components:fromDate:toDate:options: método NSCalendar components:fromDate:toDate:options: por ejemplo:

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

Si fromDate valores negativos, eso es porque fromDate no está antes de toDate . En este caso, si está tratando con un NSDatePicker solo con time, es posible que desee ajustar la hora del wakeUpTime para asegurarse de que sea en el futuro.

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