【问题标题】:Swift 2.3 Nearest Hour (Superior or Equal) from current DateSwift 2.3 距当前日期最近的时间(上或等)
【发布时间】:2017-06-05 15:18:14
【问题描述】:

我必须确定 H 和 H+3,其中 H >= 到最近的小时。

让我给你看一些例子:

如果今天的时间是 0h00 -> H = 0h 并且 H+3 = 3h

如果今天的时间是 0h01 -> H = 1h 并且 H+3 = 3h

如果今天的时间是 21h00 -> H = 21h 并且 H+3 = 0h

如果今天的时间是 22h34 -> H = 23h and H+3 = 2h (day + 1)

我是 Swift 的新手,我知道如何在 Obj C 中获取最近的时间,但对于 Swift 我不确定。

有没有一种快速的方法来确定这两个变量 HH+3 以便在任何给定时间设置两个标签的文本。

我尝试了这种方法,但它给了我最近的时间,但它是最接近的时间,而不是 >=。

func nextHourDate() -> NSDate? {
    let calendar = NSCalendar.currentCalendar()
    let date = NSDate()
    let minuteComponent = calendar.components(NSCalendarUnit.Minute, fromDate: date)
    let components = NSDateComponents()
    components.minute = 60 - minuteComponent.minute
    return calendar.dateByAddingComponents(components, toDate: date, options: [])
}

我正在使用 Swift 2.3 进行开发

编辑:

阅读答案/cmets 后,这是我开发的。

func determineH() -> NSDate? {
        let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
        let now = NSDate()
        let components = gregorian.components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: now)

        if components.minute != 0 {
            components.hour = components.hour + 1
            components.minute = 0
        }

        let date = gregorian.dateFromComponents(components)!
        return date
    }

【问题讨论】:

  • “我正在使用 Swift 2.3 进行开发” 为什么?您是“Swift 新手”,那么为什么要学习一种现在随时都会死的语言呢?学习 Swift 3,而不是 Swift 2。
  • 因为我正在维护一个使用 Swift 2.3 开发的应用程序。我需要尽快发布。当我没有压力时,我会翻译申请。
  • 好答案。 :)
  • 但是谢谢你的建议,你不是唯一一个告诉我这个的。我迫不及待想学习 Swift 3,你无法想象。
  • 我不是故意拉你的链子的。道歉。

标签: ios swift2 nsdate hour


【解决方案1】:

要获得下一个小时,请添加 1 小时,然后删除分钟。如果您希望 nextHour(12:00PM) 是 12:00PM 而不是 1:00PM,则添加 59 分 59 秒而不是 1 小时。请注意,这不涉及毫秒;如果您关心这一点,也将其归零:

    extension Date {
        func advancedToNextHour() -> Date? {
            var date = self
            date += TimeInterval(59*60+59)
            let calendar = Calendar.current
            let components = calendar.dateComponents([.second, .minute], from: date)
            guard let minutes = components.minute,
                  let seconds = components.second else {
                return nil
            }
            return date - TimeInterval(minutes)*60 - TimeInterval(seconds)
        }
        func advancedToNearest(hours: Int) -> Date? {
            guard let next = advancedToNextHour(), hours > 0 else {
                return nil
            }
            return next + TimeInterval(hours-1)*60*60
        }
    }

    print(Date().advancedToNextHour())
    print(Date().advancedToNearest(hours: 3))

【讨论】:

    【解决方案2】:

    根据您的代码:

    检查当前小时的分钟并返回到最后一个完整小时,然后才添加!?

    我不会提供那个arithmetic masterpiece 的代码,因为你已经快到那里了

    最好:更多地使用 dateComponents

    只增加 hours 属性并将分钟重置为 0!?

    comps.hours += 1
    comps.minutes = 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多