一年中两个NSDates之间的天数很快

我正在建立一个生日提醒应用程序。 我希望用户能够看到有多少天,直到某个人的下一个生日。

假设我有一个NSDate() = 2015-06-30 07:21:47 +0000

NSDate为生日= 1985-08-29 12:00:00 +0000

我怎么能得到下一个生日的天数? 我已经使用了类似这样的东西,它给出了自实际开始日期以来的负天数(有数千个生日)。 然后,我会添加365到数字差异,直到它是积极的,但它仍然返回一个不稳定的数字。 我假设是因为闰年或其他什么。

有没有一种方法可以实现? 以某种方式平衡年份组成部分,以便始终比较下一个生日而不是原始生日?

编辑:

这是我正在使用的function:

 func daysBetween(date1: NSDate, date2: NSDate) -> Int { var calendar: NSCalendar = NSCalendar.currentCalendar() let date1 = calendar.startOfDayForDate(date1) let date2 = calendar.startOfDayForDate(date2) let flags = NSCalendarUnit.CalendarUnitDay let components = calendar.components(flags, fromDate: date1, toDate: date2, options: nil) return components.day } 

我发布的示例日期我会像这样使用它:

 // sampleDate = 1985-08-29 12:00:00 +0000 daysBetween(sampleDate, date2: NSDate()) // --> 10897 

无论是积极的还是消极的,这个数字都是数以千计。 我希望将其平衡到下一个日历生日的天数。

你需要的是计算今天之后的下一次出现 (生日的日期和月份组件):

 let cal = NSCalendar.currentCalendar() let today = cal.startOfDayForDate(NSDate()) let dayAndMonth = cal.components(.CalendarUnitDay | .CalendarUnitMonth, fromDate: birthday) let nextBirthDay = cal.nextDateAfterDate(today, matchingComponents: dayAndMonth, options: .MatchNextTimePreservingSmallerUnits)! 

备注:

  • MatchNextTimePreservingSmallerUnits选项的目的是,如果生日是在2月29日(在公历中),如果年份不是闰年,则其下一次出现将计算为3月1日。

  • 您可能需要先检查生日是否为今天 ,因为看起来nextDateAfterDate()在这种情况下会返回下一个生日。

然后您可以像往常一样计算天数差异:

 let diff = cal.components(.CalendarUnitDay, fromDate: today, toDate: nextBirthDay, options: nil) println(diff.day) 

更新Swift 2.2(Xcode 7.3):

 let cal = NSCalendar.currentCalendar() let today = cal.startOfDayForDate(NSDate()) let dayAndMonth = cal.components([.Day, .Month], fromDate: birthday) let nextBirthDay = cal.nextDateAfterDate(today, matchingComponents: dayAndMonth, options: .MatchNextTimePreservingSmallerUnits)! let diff = cal.components(.Day, fromDate: today, toDate: nextBirthDay, options: []) print(diff.day) 

Swift 3更新(Xcode 8 GM):

 let cal = Calendar.current let today = cal.startOfDay(for: Date()) let dayAndMonth = cal.dateComponents([.day, .month], from: birthday) let nextBirthDay = cal.nextDate(after: today, matching: dayAndMonth, matchingPolicy: .nextTimePreservingSmallerComponents)! let diff = cal.dateComponents([.day], from: today, to: nextBirthDay) print(diff.day!) 

顺便说一下,如果有人需要这里是Swift 3中的@Aaron函数:

 func daysBetween(date1: Date, date2: Date) -> Int { let calendar = Calendar.current let date1 = calendar.startOfDay(for: date1) let date2 = calendar.startOfDay(for: date2) let components = calendar.dateComponents([Calendar.Component.day], from: date1, to: date2) return components.day ?? 0 }