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

Aar*_*ron 3 xcode date nsdate ios swift

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

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

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

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

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

编辑:

这是我正在使用的功能:

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
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*n R 8

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

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)!
Run Code Online (Sandbox Code Playgroud)

备注:

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

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

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

let diff = cal.components(.CalendarUnitDay,
    fromDate: today,
    toDate: nextBirthDay,
    options: nil)
println(diff.day)
Run Code Online (Sandbox Code Playgroud)

更新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)
Run Code Online (Sandbox Code Playgroud)

更新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!)
Run Code Online (Sandbox Code Playgroud)