奇怪的日期结果斯威夫特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: [])
}
答
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月,日期会溢出到明年一月份。
1.你希望它返回UTC? 2.邮政编码为'at12pm'。 – tktsubota
1.我并不特别在乎,但是我使用的所有NSDate都是UTC,所以只要它一致,它应该没关系? 2.完成,哎呀。例如,'startOfMonth()'返回'2016-02-01 20:00:00 + 0000'。 – brandonscript
你为什么把日期设置为12点? – tktsubota