swift2 Swift 2.3距当前日期最近的小时(上级或相等)

ma8fv8wu  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(258)

我必须确定H和H+3,其中H〉=到最接近的小时。
让我给你看一些例子:
如果今天时间是0 h 00-〉H = 0 h且H+3 = 3 h
如果今天小时是0 h 01-〉H = 1h且H+3 = 3 h
如果今天时间是21 h 00-〉H = 21 h且H+3 = 0 h
如果今天时间是22 h34-〉H = 23 h,且H+3 = 2 h(天+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中开发

编辑:

在阅读了答案/评论后,这里是我开发的。

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

2jcobegt1#

基于您的代码:

检查当前小时的分钟数并返回到上一个完整小时,然后才添加!?
我不会提供arithmetic masterpiece的代码,因为您已经快完成了

最佳:使用dateComponents更多信息

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

comps.hours += 1
comps.minutes = 0
jmo0nnb3

jmo0nnb32#

要得到下一个小时,你需要加上1小时,然后去掉分钟。如果你想让下一个小时(12:00 PM)是12:00 PM而不是1:00 PM,那么就加上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))
sulc1iza

sulc1iza3#

您也可以建立行事历延伸,如下所示:

extension Calendar {
    func nextFullHour(after date: Date) -> Date {
        let components = dateComponents([.hour, .minute], from: date)

        if components.minute != 0 {
            let fullHour = self.date(byAdding: .minute, value: -components.minute!, to: date)!
            let nextFullHour = self.date(byAdding: .hour, value: 1, to: fullHour)!
            return nextFullHour
        }

        return date
    }
}

然后就变成Calendar.current.nextFullHour(after: Date())

相关问题