【问题标题】:Strange date result calculating start of next month using NSDateComponents in Swift 2在 Swift 2 中使用 NSDateComponents 计算下个月开始的奇怪日期结果
【发布时间】:2016-02-17 19:50:34
【问题描述】:

我有一个函数:

internal func startOfNextMonth() -> NSDate? {
    guard
        let cal: NSCalendar = NSCalendar.currentCalendar(),
        let comp: NSDateComponents = NSDateComponents() else { return nil }
    comp.month = 1
    comp.day = 0
    comp.to12pm()
    let date = cal.dateByAddingComponents(comp, toDate: self.startOfMonth()!, options: [])!
    return date
}

这应该计算下个月的第一天,但​​它返回2016-03-02 08:00:00 UTC

这是否与闰年有关(2 月 29 日搞砸了?)

这是我的 startOfMonth 函数供参考,以及 to12pm() 扩展:

internal func startOfMonth() -> NSDate? {
    guard
        let cal: NSCalendar = NSCalendar.autoupdatingCurrentCalendar(),
        let comp: NSDateComponents = cal.components([.Year, .Month], fromDate: self.at12pm()!) else { return nil }
    comp.to12pm()
    return cal.dateFromComponents(comp)!
}

internal extension NSDateComponents {
    func to12pm() {
        self.hour = 12
        self.minute = 0
        self.second = 0
    }
}

internal func at12pm() -> NSDate? {
    let cal = NSCalendar.currentCalendar()
    return cal.dateBySettingHour(12, minute: 0, second: 0, ofDate: self, options: [])
}

【问题讨论】:

  • 1.你想让它返回UTC吗? 2.at12pm的邮政编码。
  • 1.我并不特别在意,但我使用的所有 NSDates 都是 UTC,所以只要它是一致的,就应该没关系吧? 2. 完成,哎呀。例如,startOfMonth() 返回2016-02-01 20:00:00 +0000
  • 为什么将日期设置为下午 12 点?
  • 因为我正在做几个基于天的计算,并且我想确保计算的天数始终保持一致。
  • 你应该使用 NSCalendar 方法 dateByAddingUnit .Month 1

标签: ios swift nsdate nscalendar nsdatecomponents


【解决方案1】:

startOfMonth() 会在下个月的第一天下午 12 点(12:00)返回,然后您在 startOfNextMonth() 中再添加 12 小时,这将导致提前一天。

NSCalendar 有一个聪明的方法来计算下个月的开始,不管夏令时变化或其他不规则情况

let calendar = NSCalendar.currentCalendar()
let components = NSDateComponents()
components.day = 1
let startOfNextMonth = calendar.nextDateAfterDate(NSDate(), matchingComponents: components, options: .MatchNextTime)

【讨论】:

  • 不错!谢谢。这更有意义。
【解决方案2】:

如果你只想计算下个月的第一天,你所要做的就是:

let calendar = NSCalendar.autoupdatingCurrentCalendar()
let todayComponents = calendar.components([.Year, .Month], fromDate: NSDate())
todayComponents.month += 1
let firstDayOfMonth = calendar.dateFromComponents(todayComponents)

测试:

print(firstDayOfMonth)

在控制台中打印:

Optional(2016-03-01 08:00:00 +0000)

另外,如果是 12 月,日期会溢出到次年的 1 月。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多