日历年中 2 个 NSDate 之间的天数 swift
Days between 2 NSDates in a calendar year swift
我正在开发一个生日提醒应用。我希望用户能够看到距离某人的下一个生日还有多少天。
假设我有一个 NSDate()
= 2015-06-30 07:21:47 +0000
生日的 NSDate
= 1985-08-29 12:00:00 +0000
我如何获得距下一个生日还有多少天?我使用了 this 之类的东西,它给出了自日期实际开始以来的负数天数(有几千个生日)。然后我将 365 添加到数值差异直到它是正数,但它仍然 returns 一个不稳定的数字。我假设是因为闰年什么的。
有什么方法可以实现吗?以某种方式平衡年份组件,以便它始终从下一个生日开始比较,而不是原始生日?
编辑:
这是我正在使用的函数:
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()
将 return 成为 下一个 生日。
然后您可以照常计算天数差异:
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
}
我正在开发一个生日提醒应用。我希望用户能够看到距离某人的下一个生日还有多少天。
假设我有一个 NSDate()
= 2015-06-30 07:21:47 +0000
生日的 NSDate
= 1985-08-29 12:00:00 +0000
我如何获得距下一个生日还有多少天?我使用了 this 之类的东西,它给出了自日期实际开始以来的负数天数(有几千个生日)。然后我将 365 添加到数值差异直到它是正数,但它仍然 returns 一个不稳定的数字。我假设是因为闰年什么的。
有什么方法可以实现吗?以某种方式平衡年份组件,以便它始终从下一个生日开始比较,而不是原始生日?
编辑:
这是我正在使用的函数:
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()
将 return 成为 下一个 生日。
然后您可以照常计算天数差异:
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
}