计算从当前时间到特定时间的时间
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 日开始的秒数。即使您在日期选择器中只看到时间组件。
这意味着,您应该注意 UIDatePicker
的 date
值,也许 "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
方法中这样做。在我的代码中,我有一个 IBOutlet
到 UILabel
称为 timeLeft
。
func updateTimeLeft()
{
let elapsedTime = futureDate.timeIntervalSinceDate(NSDate())
self.timeLeft.text = NSDateComponentsFormatter().stringFromTimeInterval(elapsedTime)
}
我有一个 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 日开始的秒数。即使您在日期选择器中只看到时间组件。
这意味着,您应该注意 UIDatePicker
的 date
值,也许 "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
方法中这样做。在我的代码中,我有一个 IBOutlet
到 UILabel
称为 timeLeft
。
func updateTimeLeft()
{
let elapsedTime = futureDate.timeIntervalSinceDate(NSDate())
self.timeLeft.text = NSDateComponentsFormatter().stringFromTimeInterval(elapsedTime)
}