【发布时间】:2016-09-24 17:12:12
【问题描述】:
我想计算距离午夜还有多少小时。我找到了大量关于制作倒数计时器的教程,但我找不到任何用于计算剩余时间的教程。
有什么想法我应该怎么做?
谢谢!
【问题讨论】:
标签: swift calendar countdowntimer nsdatecomponents
我想计算距离午夜还有多少小时。我找到了大量关于制作倒数计时器的教程,但我找不到任何用于计算剩余时间的教程。
有什么想法我应该怎么做?
谢谢!
【问题讨论】:
标签: swift calendar countdowntimer nsdatecomponents
import Foundation
let calendar = NSCalendar.currentCalendar()
let noonToday = calendar.dateBySettingHour(12, minute: 0, second: 0, ofDate: NSDate(), options: [])!
let noonishTomorow = calendar.dateByAddingUnit(.Day, value: 1, toDate: noonToday, options: [])!
let midnight = calendar.startOfDayForDate(noonishTomorow)
let components = calendar.components([.Hour, .Minute], fromDate: NSDate(), toDate: midnight, options: [])
let hoursUntilMidnight = components.hour
let minutesUntilMidnight = components.minute
你必须非常小心“午夜”,因为它并不总是存在,有时它会存在两次,等等......这就是为什么 Apple 总是建议使用中午来代替,就像我在上面所做的那样。
避免任何告诉您明确将小时设置为午夜然后减去的答案。你只是说小时,但我给了你几分钟,以防你需要看看如何做到这一点。
【讨论】:
let now = Calendar.current.dateComponents(in: .current, from: Date())
if let currentHour = now.hour {
let hoursTillMidnight = 24 - currentHour
print(hoursTillMidnight)
}
希望这对那里的人有所帮助!
干杯!
【讨论】:
一个更简单的解决方案:
let now = Calendar.current.dateComponents(in: TimeZone.current, from: Date())
let hoursTillMidnight = 24 - now.hour!
print(hoursTillMidnight)
这没有考虑分钟和秒等因素。下午 1:01 和下午 1:59 距离午夜 11 小时。您可以根据需要上下调整整点时间。
如果您的目标是较新的平台(iOS 13.5+、OS X 10.15+),并且想要“午夜 10 小时 25 分钟”之类的内容,您可以使用 RelativeDateTimeFormatter:
let now = Date()
let midnight = Calendar.current.nextDate(after: now, matching: DateComponents(hour:0), matchingPolicy: .nextTime)!
let formatter = RelativeDateTimeFormatter()
formatter.localizedString(for: midnight, relativeTo: now)
【讨论】:
Gargoyle 的代码不再构建。这是我测试过的 Swift 5 生产代码(没有强制展开)。
extension Date {
var minutesToMidnight: Int {
let calendar = NSCalendar.current
guard let noonishTomorow = calendar.date(bySetting: Calendar.Component.hour, value: 12, of: Date()) else {
return 0
}
let midnight = calendar.startOfDay(for: noonishTomorow)
let components = calendar.dateComponents([.hour, .minute], from: Date(), to: midnight)
var hoursUntilMidnight = components.hour ?? 0
var minutesLeftInHour = components.minute ?? 0
if minutesLeftInHour < 0 {
minutesLeftInHour += 60
hoursUntilMidnight -= 1
}
if hoursUntilMidnight < 0 {
hoursUntilMidnight += 24
}
print("\(hoursUntilMidnight) hours and \(minutesLeftInHour) minutes till midnight")
return hoursUntilMidnight * 60 + minutesLeftInHour
}
}
【讨论】: