【问题标题】:Using NSDateComponents to test date equality when times differ当时间不同时使用 NSDateComponents 测试日期是否相等
【发布时间】:2012-10-17 07:17:46
【问题描述】:

我想测试两个 NSDate 对象是否具有相同的年/月/日但一天中的不同时间。这是我的代码:

NSDate *date1 = [dataDictionary1 valueForKey:@"date"];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
calendar.timeZone = [NSTimeZone systemTimeZone];
NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date1];
NSDate *newDate1 = [calendar dateFromComponents:components];

NSDate *date2 = [dataDictionary2 valueForKey:@"date"];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
calendar.timeZone = [NSTimeZone systemTimeZone];
NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date2];
NSDate *newDate2 = [calendar dateFromComponents:components];

但是,newDate1 将返回 2012-05-01 05:00:00 +0000newDate2 将返回 2012-05-01 04:00:00 +0000

小时不为零,因为我的时区不是格林尼治标准时间,但为什么两个小时不相等?您知道测试不同时间的日期是否相等的更好方法吗? (也就是说,比获取每个日期组件并测试每个天/月/年的相等性更有效?)

【问题讨论】:

    标签: objective-c nsdate equality nsdatecomponents


    【解决方案1】:

    试试这个:

    NSDate *date1 = [dataDictionary1 valueForKey:@"date"];
    long noTime1 = [date1 timeIntervalSinceReferenceDate] / (60*60*24);
    
    NSDate *date2 = [dataDictionary2 valueForKey:@"date"];
    long noTime2 = [date2 timeIntervalSinceReferenceDate] / (60*60*24);
    
    if (noTime1 == noTime2) {
        // same date
    }
    

    当然,这仅在您只想比较日期部分而不关心实际的日、月或年值时才有效。

    【讨论】:

    • 谢谢,rmaddy。这真的很干净。在这个特定的例子中,我确实需要当天的信息,但是在同一个项目中还有其他地方,你的答案会非常有用:)
    猜你喜欢
    • 2012-06-20
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多