如何在 Swift 中计算当前日期的剩余小时数



我想数一数离午夜还剩下多少小时。我找到了大量关于制作倒数计时器的教程,但我找不到任何用于计算剩余时间的教程。

任何想法我应该怎么做?

谢谢!

更简单的解决方案:

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)
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

你必须非常小心"午夜",因为它并不总是存在,有时它存在两次,等等...... 这就是为什么苹果总是建议使用noon,就像我上面所做的那样。

避免任何告诉您明确将小时设置为午夜然后减去的答案。 你刚才说小时,但我给了你几分钟的时间,以防你需要看看如何做到这一点。

计算当前日期的剩余小时数:

在 Swift 5.2 中:

        let now = Calendar.current.dateComponents(in: .current, from: Date())
        if let currentHour = now.hour {
          let hoursTillMidnight = 24 - currentHour
            print(hoursTillMidnight)
        }

希望这对那里的人有帮助!

干杯!

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
    }
}