【问题标题】:Comparing dates issue in iOS [duplicate]iOS中的比较日期问题[重复]
【发布时间】:2014-02-04 07:35:33
【问题描述】:

我正在使用以下代码来比较两个 NSDates。结果稍后用于瞬态属性以组织表格视图部分中的对象。我可以保证核心数据存储中有足够的对象,因此三个可能的结果都存在,但 NSLog 显示选项 tmp = @"1", 永远不会被抛出。

-(NSString *)sectionIdentifier{

    [self willAccessValueForKey:@"sectionIdentifier"];
    NSString *tmp = [self primitiveValueForKey:@"sectionIdentifier"];
    [self didAccessValueForKey:@"sectionIdentifier"];

    if (!tmp){

        NSDate *date = self.todoDueDate;
        NSDate *todayDate = [NSDate date];

        NSLog(@"date= %@",date);
        NSLog(@"todayDate = %@",todayDate);



        if([date
            compare:todayDate] == NSOrderedSame) {
            tmp = @"1";//TODAY
        }
        else if([date
                 compare:todayDate] == NSOrderedDescending){
            tmp = @"2";//OVERDUE
        }
        else if ([date
                  compare:todayDate] == NSOrderedAscending){
            tmp =@"0";//UPCOMING
        }
        NSLog(@"Tmp= %@",tmp);

        [self setPrimitiveValue:tmp forKey:@"sectionIdentifier"];

    }

这里是日志:

2014-01-15 10:10:52.732 To-Do Pro Light[21458:a0b] date      = 2014-01-10 19:53:19 +0000
2014-01-15 10:10:52.735 To-Do Pro Light[21458:a0b] todayDate = 2014-01-15 17:10:52 +0000
2014-01-15 10:10:52.742 To-Do Pro Light[21458:a0b] Tmp= 0
2014-01-15 10:10:52.743 To-Do Pro Light[21458:a0b] date      = 2014-01-14 17:45:45 +0000
2014-01-15 10:10:52.746 To-Do Pro Light[21458:a0b] todayDate = 2014-01-15 17:10:52 +0000
2014-01-15 10:10:52.747 To-Do Pro Light[21458:a0b] Tmp= 0
2014-01-15 10:10:52.748 To-Do Pro Light[21458:a0b] date      = 2014-01-14 17:57:44 +0000
2014-01-15 10:10:52.749 To-Do Pro Light[21458:a0b] todayDate = 2014-01-15 17:10:52 +0000
2014-01-15 10:10:52.751 To-Do Pro Light[21458:a0b] Tmp= 0
2014-01-15 10:10:52.753 To-Do Pro Light[21458:a0b] date      = 2014-01-15 16:31:48 +0000
2014-01-15 10:10:52.755 To-Do Pro Light[21458:a0b] todayDate = 2014-01-15 17:10:52 +0000
2014-01-15 10:10:52.756 To-Do Pro Light[21458:a0b] Tmp= 0
2014-01-15 10:10:52.758 To-Do Pro Light[21458:a0b] date      = 2014-01-15 16:32:06 +0000
2014-01-15 10:10:52.759 To-Do Pro Light[21458:a0b] todayDate = 2014-01-15 17:10:52 +0000
2014-01-15 10:10:52.761 To-Do Pro Light[21458:a0b] Tmp= 0
2014-01-15 10:10:52.762 To-Do Pro Light[21458:a0b] date      = 2014-01-15 17:03:40 +0000
2014-01-15 10:10:52.763 To-Do Pro Light[21458:a0b] todayDate = 2014-01-15 17:10:52 +0000
2014-01-15 10:10:52.764 To-Do Pro Light[21458:a0b] Tmp= 0
2014-01-15 10:10:52.766 To-Do Pro Light[21458:a0b] date      = 2014-01-15 18:33:48 +0000
2014-01-15 10:10:52.767 To-Do Pro Light[21458:a0b] todayDate = 2014-01-15 17:10:52 +0000
2014-01-15 10:10:52.768 To-Do Pro Light[21458:a0b] Tmp= 2

我做错了什么?

【问题讨论】:

  • 您日志中的所有NSDate 对象都不相同。为什么你希望看到Tmp= 1?请记住,时间(以毫秒计)包含在比较中。
  • 以及如何在不考虑时间的情况下比较日期,只考虑年月日?
  • @mvasco:NSDateComponents 可以在这里提供帮助。
  • 你永远不会得到完全匹配,因为两个 NSDate 对象必须在当天引用相同的 MILLISECOND 才能发生。最简单的是使用 NSDateFormatter 将日期格式化为 yyyy/MM/dd 并比较字符串。
  • @HotLicks,请将您的评论放在答案中,让我将其作为选定答案进行检查。我将使用 NSDataFormatter 更改我的代码。谢谢。

标签: ios nsdate


【解决方案1】:
NSDate *startDate = ...;
NSDate *endDate = ...;

NSCalendar *gregorian = [[NSCalendar alloc]
                 initWithCalendarIdentifier:NSGregorianCalendar];

NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit;

NSDateComponents *components = [gregorian components:unitFlags
                                          fromDate:startDate
                                          toDate:endDate options:0];
NSInteger months = [components month];
NSInteger days = [components day];
NSInteger years = [components year];

如果三个都是 0 - 日期相等。

更多信息请访问 - https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html#//apple_ref/doc/uid/TP40007836-SW1

【讨论】:

    【解决方案2】:

    您永远不会得到完全匹配,因为两个 NSDate 对象必须在当天引用相同的 MILLISECOND 才能发生。最简单的方法是使用 NSDateFormatter 将日期格式化为 yyyy/MM/dd,然后比较结果字符串。

    (不要忘记根据您的要求适当设置时区。)

    【讨论】:

    • 使用NSDateFormatter 的效率远低于使用日期组件。
    • 我将编辑我的问题以添加我所做的更改,现在它正在工作..谢谢..
    • @rmaddy - 但更直接和万无一失。如果格式化程序是预先创建的,效率差异不会那么大。
    • @rmaddy - 如果支持儒略日,钟摆将更倾向于使用日期组件,因此没有必要检索和组合三个单独的数字。
    • 是的,这将是一个很好的补充,但请记住,使用日期格式化程序最有可能在幕后使用日期组件。所以现在你在上面加上一堆字符串处理。节省一两行代码会浪费很多时间。
    猜你喜欢
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多