计算从当前时间到特定时间的时间

时间:2016-05-31 18:28:51

标签: ios swift nsdate nstimer uidatepicker

我有一个UIDatePicker,仅限时间。该应用程序将datePicker中的选定时间保存在变量中,当达到此时间时,它会触发UILocalNotification

因此,有一个标签显示本地通知触发前的剩余时间。所以它基本上有点像倒数计时器。 我怎样才能做到这一点?

Date to String :(用于显示fireDate)

func formatTimeForDisplay(date:NSDate) -> String {
        let formatter = NSDateFormatter()
        formatter.locale = NSLocale.currentLocale()
        formatter.timeStyle = NSDateFormatterStyle.ShortStyle
        return formatter.stringFromDate(date)
        }

NSLocalNotification的扩展:(用于将NSDate从UIDatePicker转换为用于LocalNotification的fireDate)

extension NSDate {
    var minute: Int {
        return NSCalendar.currentCalendar().component(.Minute, fromDate: self)
    }
    var hour: Int {
        return NSCalendar.currentCalendar().component(.Hour, fromDate: self)
    }
    var day: Int {
        return NSCalendar.currentCalendar().component(.Day, fromDate: self)
    }
    var month: Int {
        return NSCalendar.currentCalendar().component(.Month, fromDate: self)
    }
    var year: Int {
        return NSCalendar.currentCalendar().component(.Year, fromDate: self)
    }
    var fireDate: NSDate {
        let today = NSDate()
        return NSCalendar.currentCalendar().dateWithEra(1,
                                                        year: today.year,
                                                        month: today.month,
                                                        day: { hour > today.hour || (hour  == today.hour
                                                            &&  minute > today.minute) ? today.day : today.day+1 }(),
                                                        hour: hour,
                                                        minute: minute,
                                                        second: 0,
                                                        nanosecond: 0
            )!
    }

2 个答案:

答案 0 :(得分:0)

要显示用户友好的字符串,如果您的应用针对的是iOS 8及更高版本,则可以参考 # The default HTTP method used to sign out a resource. Default is :delete. if Rails.env.test? config.sign_out_via = :get else config.sign_out_via = :delete end

此外,您可能会遇到一个问题。 NSDateComponentsFormatter返回一个UIDatePicker对象,它封装了从2001年1月1日起的秒数。即使您在日期选择器中只看到时间组件。 这意味着,您应该注意NSDate的{​​{1}}值,也许"修复"使用date API。

答案 1 :(得分:0)

为此,您需要使用NSTimer来更新倒计时标签。

在ViewController中,为计时器创建一个变量。

var timer = NSTimer()

我还设置了一个临时变量来保存未来的日期 - 你没有发布代码,所以我不确定你的名字是什么。在我的代码中,我将其称为futureDate

let futureDate = NSDate().dateByAddingTimeInterval(60*60*2.4)

当您使用选择日期并希望倒计时开始时,您将需要启动计时器触发以调用将更新标签的方法。在这个例子中,我称之为updateTimeLeft

timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "updateTimeLeft", userInfo: nil, repeats: true)

然后,我们只需要计算本地通知将要触发的现在和未来日期之间的差异。我们在updateTimeLeft方法中执行此操作。在我的代码中,我IBOutlet的{​​{1}}名为UILabel

timeLeft