我正在尝试比较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日?
答案 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]
返回NSOrderedAscending
:otherDay
早于而不是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代替您当地的时区进行显示。