2016-09-14 49 views
0

我有一个函数来创建一个日期...dateComponents(_,从,到)返回错误的月数

func date(withYear year: Int, month: Int, day: Int) -> Date { 
    let components = DateComponents(calendar: Calendar.current, timeZone: nil, era: nil, year: year, month: month, day: day, hour: 0, minute: 0, second: 0, nanosecond: 0, weekday: nil, weekdayOrdinal: nil, quarter: nil, weekOfMonth: nil, weekOfYear: nil, yearForWeekOfYear: nil) 
    return components.date! 
} 

它只是需要的日,月,年的方便。

所以我创建了两个日期。

let startDate = date(withYear: 2016, month: 9, day: 30) // prints to console as 2016-09-29 23:00:00 +0000 
let endDate = date(withYear: 2016, month: 11, day: 1) // prints to console as 2016-11-01 00:00:00 +0000 

,然后计算它们之间的月数...

let components = Calendar.current.dateComponents([.month], from: startDate, to: endDate) 

print(components.month) // returns 1 

不应该这是2?如何计算月份组件?这只是天数除以30之后的天数?如果是这样,我需要一种计算月份数的新方法。

+1

可以在计算时间之前添加startDate和endDate的值吗? –

+0

@Lu_补充。看起来我选择了一个棘手的日期范围,因为它跨越夏令时的变化,但它也不应该在这里有所作为,但一旦这个工作正常,就要考虑。 :) – Fogmeister

+2

日期之间的绝对差异是1个月和2天,所以1个月是正确的。 – vadian

回答

0

我有同样的问题,但NSCalendar工作正常这个代码示例证明了这一点。

let date = NSDate() 
    let calendar = NSCalendar.currentCalendar() 
    let components = calendar.components([.Day , .Month , .Year], fromDate: date) 

    let twoMonthdate = calendar.dateByAddingUnit(.Month, value: 2, toDate:date, options: []) 

    let difference = calendar.components([.Month], fromDate: date, toDate: twoMonthdate!, options: []) 
    //differences is 2 monthses 

在你遇到的情况不同是1个月和几天。这就是为什么你会收到这样的结果。