使用NSDate/NSCalendar测试周年日期

问题描述:

我在想如何确定今天是否为NSCalendar项目的周年纪念。我发现的一切都将特定日期的月份,日期,年份与另一个特定的月份,日期和年份进行比较。粒度对我很不利,因为它比较的第一件事就是一年。使用NSDate/NSCalendar测试周年日期

这是我到目前为止。我读过文档,但我错过了一些东西(基本)。它是什么?

// get the current date 
let calendar = NSCalendar.currentCalendar() 
var dateComponents = calendar.components([.Month, .Day], fromDate: NSDate()) 

let today = calendar.dateFromComponents(dateComponents) 

var birthDates = [NSDate]() 

let tomsBirthday = calendar.dateWithEra(1, year: 1964, month: 9, day: 3, hour: 0, minute: 0, second: 0, nanosecond: 0) 
birthDates.append(tomsBirthday!) 

let dicksBirthday = calendar.dateWithEra(1, year: 1952, month: 4, day: 5, hour: 0, minute: 0, second: 0, nanosecond: 0) 
birthDates.append(dicksBirthday!) 

let harrysBirthday = calendar.dateWithEra(1, year: 2015, month: 10, day: 27, hour: 0, minute: 0, second: 0, nanosecond: 0) 
birthDates.append(harrysBirthday!) 

for birthday in birthDates { 
    // compare the month and day to today's month and day 
    // if birthday month == today's month { 
    //  if birthday day == today's day { 
    //    do something 
    //  } 

} 

为了使日期比较,而在非闰年治疗2月29日为3月1日,你需要使用的人的生日的月份和日期部件本年度构建一个NSDate

另外,不要在构建NSDate时比较日期时使用午夜。 Some days don't have a midnight in some time zones.改用中午。

struct Person { 
    let name: String 
    let birthYear: Int 
    let birthMonth: Int 
    let birthDay: Int 
} 

let people = [ 
    Person(name: "Tom", birthYear: 1964, birthMonth: 9, birthDay: 3), 
    Person(name: "Dick", birthYear: 1952, birthMonth: 4, birthDay: 5), 
    Person(name: "Harry", birthYear: 2015, birthMonth: 10, birthDay: 28) 
] 

let calendar = NSCalendar.autoupdatingCurrentCalendar() 

let todayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate: NSDate()) 
todayComponents.hour = 12 
let todayNoon = calendar.dateFromComponents(todayComponents) 

for person in people { 
    let components = todayComponents.copy() as! NSDateComponents 
    // DON'T copy person.birthYear 
    components.month = person.birthMonth 
    components.day = person.birthDay 
    let birthdayNoon = calendar.dateFromComponents(components) 
    if todayNoon == birthdayNoon { 
     print("Happy birthday, \(person.name)!") 
    } 
} 
+0

你可以在birthDays.filter({$ 0 ==今日})改变持续语句是生日,如果检查 – totiG

+0

真棒删除!我以为我必须创造这个生日,然后再分开来比较它。这很容易。谢谢! – Adrian

+1

有一个问题(我认为)。如果此人的生日是在2月29日,而当前年份是*不是*闰年,那么与今天的日期的比较应在3月1日生效。因此,将日期分量(与当前年份一起)转换可能会更好,到一个NSDate并用'isDateInToday()'检查。 –