【问题标题】:How to Calculate number of hours left for the current date in Swift如何在 Swift 中计算当前日期的剩余小时数
【发布时间】:2016-09-24 17:12:12
【问题描述】:

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

有什么想法我应该怎么做?

谢谢!

【问题讨论】:

    标签: swift calendar countdowntimer nsdatecomponents


    【解决方案1】:
    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 总是建议使用中午来代替,就像我在上面所做的那样。

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

    【讨论】:

    • 如果您使用的是 OS X,则导入“Foundation”。如果您使用的是 iOS,请不要使用该行,因为您已经包含了 UIKit。
    【解决方案2】:

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

    在 Swift 5.2 中:

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

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

    干杯!

    【讨论】:

      【解决方案3】:

      一个更简单的解决方案:

      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)
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多