比较2个日期比IOS少了1天

时间:2014-01-31 08:06:50

标签: ios iphone objective-c nsdate nsdatecomponents

我正在尝试比较2个日期,但在我减少1天

这是一个片段:

NSDateComponents* dateComponents = [[NSDateComponents alloc] init];

[dateComponents setYear: 2014];
[dateComponents setMonth: 1];
[dateComponents setDay: 31];

NSCalendar* calendar = [NSCalendar currentCalendar];

NSDate* otherDay = [calendar dateFromComponents: dateComponents];


NSDate * todaydate= [NSDate date];

if ([otherDay compare:todaydate]>= NSOrderedDescending)
{
    NSLog(@"In If other Date= %@ & Today = %@ ", otherDay,todaydate);
}else
{
    NSLog(@"I am in else other date= %@ and today = %@ ",otherDay, todaydate);
}

我得到的日志是:

I am in else other date= 2014-01-30 18:30:00 +0000 and today = 2014-01-31 08:34:21 +0000

为什么它会显示其他日期= 2014年1月30日

2 个答案:

答案 0 :(得分:2)

您需要设置NSDateComponents时区,例如

[dateComponents setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];

或者 trojanfoe的建议您还可以设置NSCalendar时区,例如,

[calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];

要将 otherDay todaydate 完全比较,请参阅 Martin R 的答案,您需要设置

  

NSDate * todaydate;
  [calendar rangeOfUnit:NSDayCalendarUnit startDate:& todaydate interval:NULL forDate:[NSDate date]];

Martin R's 回答这非常有用。

答案 1 :(得分:2)

您的问题有两个不同的方面。首先,

NSDateComponents* dateComponents = [[NSDateComponents alloc] init];
[dateComponents setYear: 2014];
[dateComponents setMonth: 1];
[dateComponents setDay: 31];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDate* otherDay = [calendar dateFromComponents: dateComponents];

otherDay计算为“2014-01-31 00:00”(在您所在的时区),

NSDate *todaydate = [NSDate date];

计算todaydate作为当前时间点,包括小时,分钟 和秒,例如“2014-01-31 13:00:00”(在您所在的时区)。因此

[otherDay compare:todaydate]

返回NSOrderedAscendingotherDay 早于而不是todaydate

您可能想要的是将todaydate计算为当天的开头 (今天00:00)这可以作为

完成
NSDate * todaydate;
[calendar rangeOfUnit:NSDayCalendarUnit startDate:&todaydate interval:NULL forDate:[NSDate date]];

现在[otherDay compare:todaydate]正如您预期的那样返回NSOrderedSame


另一方面是NSLog输出。使用NSDate打印NSLog() 根据GMT打印日期,您所在时区的“2014-01-31 00:00”是 与GMT中的“2014-01-30 18:30:00 +0000”完全相同。

输出正确,它只使用GMT代替您当地的时区进行显示。