UIDatePicker минус точное время - Swift

Я делаю будильник, который покажет вам, сколько часов и минут вы спите. Я установил UIDatePicker, где пользователь выбирает, в какое время он хочет проснуться. Он также сообщает точное время с точностью до секунды. Часть, на которой я застрял, - это то, сколько часов они собираются поспать. Я попытался просто вычесть точное время из UIDatePicker. Это сработало, если бы они оба были в АМ. Например, если пользователь хотел проснуться в 10:30, а это 9:30, все, что вам нужно сделать, это вычесть 10:30 из 9: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


person alex    schedule 09.11.2014    source источник
comment
Измените свой выбор даты на 24-часовой формат, а не на 12, возможно.   -  person Abizern    schedule 09.11.2014
comment
@Abizern Это, вероятно, сработает, но как я могу это сделать, это какая-то функция или просто добавление 12 к часу?   -  person alex    schedule 09.11.2014
comment
Он установлен в вашем регионе (я живу в стране с круглосуточным режимом работы, поэтому я не вижу am / pm). Но почему бы просто не добавить день к следующему времени срабатывания, если текущее время позже, чем время будильника.   -  person Abizern    schedule 09.11.2014
comment
@Abizern Я знаю, как добавить секунды ко времени обжига, но как добавить день?   -  person alex    schedule 09.11.2014
comment
NSDateComponents. Из-за недавних проблем, я предлагаю вам прочитать Руководство по программированию даты и времени. Особенно рекомендую раздел о выполнении календарных расчетов.   -  person Abizern    schedule 09.11.2014


Ответы (2)


Вот пример игровой площадки 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")
person user212514    schedule 12.11.2014

Вы можете использовать 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)!
}
person Rob    schedule 11.11.2014
comment
Я хочу получить оставшиеся часы и показать там, где написано Xhours Xminutes, так есть ли способ получить часы сна, которые они получают? Например, если я хочу проснуться в 7:30 (что внутри UIDatePicker) и сейчас 19:30, мне нужен способ, который вычисляет время между этими двумя временами. - person alex; 11.11.2014
comment
Вот что делает вышеупомянутое. components.hour содержит количество часов до даты / времени средства выбора, components.minute содержит количество минут и т. Д. Я просто печатаю его на консоли, но вы можете соответствующим образом обновить свои UILabel объекты. - person Rob; 11.11.2014
comment
Это именно то, что я ищу, но есть ли способ удалить отрицательные знаки, чтобы он просто показывал положительные часы, например, если было -11 часов. Я хочу, чтобы было 11 часов, а не -11. Заранее спасибо, Роб, это действительно помогло, просто ответь на этот вопрос, и ты получишь награду. - person alex; 11.11.2014
comment
Просто убедитесь, что fromDate и toDate (а) в правильном порядке; и (б) что toDate действительно дата в будущем. Если средство выбора даты показывает только время, если вы скажете 6:00, он может вернуть NSDate, который соответствует сегодняшнему дню 6:00. Таким образом, вы можете сравнить результирующий NSDate, и если он до now, вы можете добавить один день, чтобы завтра он стал 6:00 утра. См. Исправленный ответ. - person Rob; 11.11.2014
comment
Вы будете делать это всякий раз, когда берете дату из средства выбора даты. Вам нужно убедиться, что вы смотрите на NSDate в будущем. Итак, в моем примере да, я делаю это в valueChangedForPicker. - person Rob; 11.11.2014
comment
Я добавил оператор if, но как его назвать, чтобы негативы больше не были негативными. Я просто остаюсь прежним? Как это: timeWakeUp.text = (String(format: "%02d:%02d:%02d", components.hour, components.minute, components.second)) - person alex; 11.11.2014
comment
Если вы исправите wakeUpDate перед вызовом components:fromDate:toDate:options:, у вас не должно быть отрицательных значений. - person Rob; 11.11.2014