一年中两个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 }
- iOS – 如何在手机上的ssh会话中查看NSLog和printf输出?
- 如何快速将popoverview居中
- iOS快速删除UITableView单元分隔符空间
- 在故事板中将UITableView的rowHeight设置为UITableViewAutomaticDimension?
- ios GPUImage,小image processing效果不好?
- 无法使用LinkedIn的OAuth入门套件共享
- 在Xcode5中加载不同的视图控制器
- 用UIViewreplaceUINavigationControllers NavigationBar
- UITableviewCell中的核心文本重叠并重复并叠加在其他单元格上