奇怪的日期结果斯威夫特2

问题描述:

计算使用NSDateComponents下个月开始我有一个函数:奇怪的日期结果斯威夫特2

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

这是不是用它做是一个闰年

这是我参考startOfMonth功能,并且to12pm()扩展(2月29日搞乱它?):

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: []) 
} 
+0

1.你希望它返回UTC? 2.邮政编码为'at12pm'。 – tktsubota

+0

1.我并不特别在乎,但是我使用的所有NSDate都是UTC,所以只要它一致,它应该没关系? 2.完成,哎呀。例如,'startOfMonth()'返回'2016-02-01 20:00:00 + 0000'。 – brandonscript

+0

你为什么把日期设置为12点? – tktsubota

startOfMonth()下午12点(中午12点)返回下一个月,然后再在startOfNextMonth()上再增加12小时,这样会在一天前结果。

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

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

好!谢谢。这更有意义。 – brandonscript

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

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月,日期会溢出到明年一月份。