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

count time from current time to specific time

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

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

日期到字符串:(用于显示 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
            )!
    }

如果您的应用针对 iOS 8 及更高版本,您可以参考 NSDateComponentsFormatter 来显示用户友好的字符串。

另外,您可能会遇到一个问题。 UIDatePicker 返回一个 NSDate 对象,它封装了从 2001 年 1 月 1 日开始的秒数。即使您在日期选择器中只看到时间组件。 这意味着,您应该注意 UIDatePickerdate 值,也许 "fix" 和 NSCalendar API。

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

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

var timer = NSTimer()

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

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

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

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

然后,我们只需要计算现在和将来触发本地通知的日期之间的差异。我们在 updateTimeLeft 方法中这样做。在我的代码中,我有一个 IBOutletUILabel 称为 timeLeft

func updateTimeLeft()
{
    let elapsedTime = futureDate.timeIntervalSinceDate(NSDate())
    self.timeLeft.text = NSDateComponentsFormatter().stringFromTimeInterval(elapsedTime)
}