生成月份的开始和结束。斯威夫特2

问题描述:

我有以下代码:生成月份的开始和结束。斯威夫特2

func rangeOfPeriod(period: NSCalendarUnit, date: NSDate) -> (NSDate, NSDate) { 
     let calendar = NSCalendar.currentCalendar() 
     var startDate: NSDate? = nil 
     var duration: NSTimeInterval = 0 

     calendar.rangeOfUnit(period, startDate: &startDate, interval: &duration, forDate: date) 

     let endDate = startDate!.dateByAddingTimeInterval(duration - 1) 

     return (startDate!, endDate) 
} 

当我打印以下行:

print("Day test = \(rangeOfPeriod(.Day, date: NSDate()))") 
print("Week test = \(rangeOfPeriod(.WeekOfYear, date: NSDate()))") 
print("month test = \(rangeOfPeriod(.Month, date: NSDate()))") 
print("Year test = \(rangeOfPeriod(.Year, date: NSDate()))") 

从预计本月除了所有这些工作。

因此我得到'月度测试=(2016-03-01 00:00:00 +0000,2016-03-31 22:59:59 +0000)',它似乎缺少一个小时。对于所有其他人我得到'2016-03-26 23:59:59 +0000'。

任何帮助,将不胜感激

+0

[迅速在当月的第一天和最后一天(的可能的复制http://*.com/questions/ 33605816 /当前月份的最后一天和最后一个月) –

+1

夏令时 – Sulthan

也许有一个关于在rangeOfUnit方法interval参数混乱。

从文档

func rangeOfUnit(_ unit: NSCalendarUnit, 
     startDate datep: AutoreleasingUnsafeMutablePointer<NSDate?>, 
      interval tip: UnsafeMutablePointer<NSTimeInterval>, 
      forDate date: NSDate) -> Bool 

.....

尖端:返回时,包含日历单位的期间(作为NSTimeIntervalunit该 包含日期date


这个月(2016年3月),由于夏令时更改的有效期是

31 * 86400.0 - 3600.0 = 2674800.0 

这意味着有一个小时失踪,但它没有指定时。


要获得这一个月更准确的结束

func endOfThisMonth() -> NSDate 
{ 
    let calendar = NSCalendar.currentCalendar() 
    let components = NSDateComponents() 
    components.day = 1 
    let startOfNextMonth = calendar.nextDateAfterDate(NSDate(), matchingComponents: components, options: .MatchNextTime)! 
    return calendar.dateByAddingUnit(.Second, value: -1, toDate: startOfNextMonth, options: [])! 
}