2014-11-09 13 views
5

Sto facendo una sveglia dove ti dirà quante ore e minuti di sonno ottieni. Ho impostato un UIDatePicker in cui l'utente sceglie a che ora vogliono svegliarsi. Indica anche l'ora esatta per il secondo. La parte su cui sono bloccato è quante ore di sonno avranno. Ho provato semplicemente a sottrarre l'ora esatta dal UIDatePicker. Questo ha funzionato se fossero entrambi nell'AM. Ad esempio, se l'utente desiderava svegliarsi alle 10:30 e sono le 9:30, tutto quello che devi fare è sottrarre 10:30 dalle 9:30 per ottenere 1 ora. Presto ho capito che non avrebbe funzionato se fossero stati diversi giorni di tempo, ad es. Antimeridiane o pomeridiane.UIDatePicker meno l'ora esatta - Swift

Come ho avuto il tempo dalla 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) 

Come ho avuto il tempo esatto

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) 

La mia domanda:

Come faccio a sottrarre il UIDatePicker dall'esatto tempo di ottenere le ore di sonno che l'utente sta ottenendo?

theff

+0

Cambia la tua selezione data per essere in formato 24 ore invece di 12, forse. – Abizern

+0

@Abizern Probabilmente funzionerebbe, ma come potrei fare questo è un qualche tipo di funzione o semplicemente aggiungere 12 all'ora? – alex

+0

È impostato in base alle impostazioni internazionali (io vivo in un paese con orologio di 24 ore, quindi non vedo am/pm) Ma perché non aggiungere un giorno alla prossima accensione se l'ora corrente è successiva all'ora della sveglia. – Abizern

risposta

5

Ecco un esempio da un parco giochi 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") 
12

È possibile utilizzare il metodo NSCalendarcomponents:fromDate:toDate:options:, ad esempio:

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

Se stai ricevendo i valori negativi, che è perché è fromDate non prima toDate. In questo caso, se hai a che fare con un solo con il tempo, potresti voler regolare l'ora dello wakeUpTime per assicurarti che sia in futuro.

var wakeUpTime = datePicker.date 

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

Voglio avere le ore rimanenti e mostrarlo dove dice "Xhours Xminutes", quindi c'è un modo per ottenere le ore di sonno che ottengono? Per esempio se voglio svegliarmi alle 7:30 (cosa c'è all'interno dell'UIDatePicker) ed è alle 19:30 ho bisogno di un modo che calcoli il tempo tra quelle 2 volte – alex

+0

Ecco come funziona. 'components.hour' contiene il numero di ore fino alla data/ora del selettore,' components.minute' contiene quanti minuti, ecc. Sto solo stampandolo sulla console, ma potresti aggiornare gli oggetti 'UILabel' di conseguenza. – Rob

+0

Questo è esattamente quello che sto cercando, ma c'è un modo per rimuovere i segni negativi in ​​modo che mostri solo le ore positive, ad esempio se fosse -11 ore. Voglio che siano solo 11 ore non -11.Grazie in anticipo, Rob ha davvero aiutato a rispondere e ottieni la taglia. – alex