从当前日期开始的Swift 2.3最近一小时(优等或平等)

时间:2017-01-20 15:20:05

标签: ios swift2 nsdate hour

我必须确定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且H + 3 = 2h(第+ 1天)

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

是否有快速方法可以确定这两个变量 H H + 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中开发

编辑:

在阅读答案/评论之后,这就是我开发的内容。

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
    }

2 个答案:

答案 0 :(得分:2)

基于您的代码:

检查当前小时的分钟并返回上一个小时,然后再添加!?

我没有提供arithmetic masterpiece的代码,因为你已经差不多了

最好:使用dateComponents更多

只增加小时属性并将分钟重置为0!

comps.hours += 1
comps.minutes = 0

答案 1 :(得分:1)

要获得下一个小时,请添加1小时,然后删除分钟。如果您希望nextHour(中午12:00)为12:00 PM而不是下午1:00,则添加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))