比较两个NSDate

时间:2014-07-08 16:17:48

标签: ios nsdate

我有一个带有2个按钮的UIViewController:今天和昨天。每次客户端今天点击它都需要设置今天的属性_date和昨天的相同。

我设置属性值的方法如下:

-(IBAction)dateButtonTouched:(id)sender
 {
    if(![sender isSelected])
    {
      NSCalendar *cal = [NSCalendar currentCalendar];
      NSDateComponents *components = [cal components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:[[NSDate alloc] init]];
      [components setMinute:-[components minute]];
      [components setSecond:-[components second]];

      if([sender tag] == YESTERDAY)
      {
        [components setHour:-24];
        _date= [cal dateByAddingComponents:components toDate: [NSDate date] options:0]; //YESTERDAY
      }
      else
      {
        NSDate *today = [NSDate date];
        [components setHour:0];
        _date= [cal dateByAddingComponents:components toDate: today options:0]; //TODAY
      }
     NSLog(@"user selected date %@",_date);
    }
   }

在下面的方法中,我试图检查_date是今天还是昨天:

-(void) viewWillLayoutSubviews
{
    NSDateFormatter *dateFormat = [NSDateFormatter new];
    [dateFormat setDateFormat:@"MM-dd-YY"];
    self.dateLabel.text = [dateFormat stringFromDate:_date];

    NSCalendar *cal = [NSCalendar currentCalendar];
    NSDateComponents *components = [cal components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:[[NSDate alloc] init]];
    [components setMinute:-[components minute]];
    [components setSecond:-[components second]];
    [components setHour:0];
    NSDate *today = [cal dateByAddingComponents:components toDate: [NSDate date] options:0]; //TODAY
    [components setHour:-24];
    NSDate *yesterday =  [cal dateByAddingComponents:components toDate: [NSDate date] options:0]; //YESTERDAY
    if([_date isEqualToDate:yesterday])
    {
      //do something
    }
    else if( [_date isEqualToDate:today])
    {
      //do something
    }
}

_date从来没有今天或昨天,但如果我调试它,打印它或比较描述是相同的。

2 个答案:

答案 0 :(得分:0)

NSDate实例表示特定时刻。它比昨天和#34;更具体。或"今天"。而不是尝试通过日期组件重置小时,分钟和秒,也许您应该比较您感兴趣的组件:日,月和年。或者您可以使用日历在组件级别进行比较:

NSDate *today = [NSDate date];
NSDate *someDay; // the date to compare

NSCalendar *cal = [NSCalendar currentCalendar];

NSDateComponents *difference = [cal components:NSDayCalendarUnit fromDate:today toDate:someDay options:nil];

if (difference.day == -1) {
    // yesterday
} else if (difference.day == 0) {
    // today
}

如果不确切知道自己想做什么,就更难以更具体。

答案 1 :(得分:0)

NSDate对象包含日期和时间,编码为一个基本上是自2000年1月1日以来的微秒数的值。

当您进行两次连续的[NSDate date]操作时,您将获得两个不同的值,如果不是因为时间实际上在两者之间发生了很大变化,那么因为大多数计算机时钟实现确保您在每次访问时获得不同的值。

NSDate的isEqualToDate函数比较两个NSDate对象的所有位,看它们是否完全相等。这意味着,如果两者甚至相隔微秒,它们似乎不会相等。

如果要查看两个NSDate值是否在同一天,您应该使用NSDateFormatter将它们格式化为字符串并比较字符串,或者使用NSDateComponent函数之一来计算它们之间的天数(几种方法到这样做。)