iOS:比较两个NSDate-s没有时间部分 [英] iOS: Compare two NSDate-s without time portion

查看:171
本文介绍了iOS:比较两个NSDate-s没有时间部分的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想比较两个日期:date1和date2

  2011-06-06 12:59:48.994 Project [419 :707] firstDate:2011-06-06 10:59:21 +0000 
2011-06-06 12:59:49.004项目[419:707] selectedData:2011-06-06 10:59:17 + 0000

但这些日期有不同的时间,当我使用NSOrderedSame它不工作,我解决了?



我的代码:

  NSDate * firstDate = [appDelegate.project objectAtIndex:i] objectAtIndex:3]; 
NSDate * secondDate = [[appDelegate.project objectAtIndex:i] objectAtIndex:4];

NSCalendar * calendar = [NSCalendar currentCalendar];
NSInteger comps =(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit);

NSDateComponents * date1Components = [日历组件:comps
fromDate:firstDate];
NSDateComponents * date2Components = [日历组件:comps
fromDate:secondDate];
NSDateComponents * date3Components = [calendar components:comps fromDate:appDelegate.selectedDate];

NSLog(@firstDate:%@,[date1Components date]);
NSLog(@secondDate:%@,[date2Components date]);
NSLog(@selectedData:%@,[date3Components date]);

NSComparisonResult compareStart = [[date1Components date] compare:[date3Components date]];
NSComparisonResult compareEnd = [[date2Components date] compare:[date3Components date]];

if((compareStart == NSOrderedAscending || compareStart == NSOrderedSame)
&&(compareEnd == NSOrderedDescending || compareEnd == NSOrderedSame))

{
NSLog(@inside);

然后我想比较我的日期和条目在if当date1< = selectedDate< = = date2;现在我明白,因为我有一个警告:我应该添加这个[date1Components date],它的工作;问题是我在NSLog的空值,为什么

解决方案

  NSCalendar * calendar = [NSCalendar currentCalendar]; 
NSInteger comps =(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit);

NSDateComponents * date1Components = [日历组件:comps
fromDate:date1];
NSDateComponents * date2Components = [日历组件:comps
fromDate:date2];

date1 = [calendar dateFromComponents:date1Components];
date2 = [calendar dateFromComponents:date2Components];

NSComparisonResult result = [date1 compare:date2];
if(result == NSOrderedAscending){
} else if(result == NSOrderedDescending){
} else {
//相同
}






还有一种方便的方法来为给定日期创建日期表示给定单元的开头: [aCalendar rangeOfUnit:startDate:interval:forDate:]

要说明此方法的工作原理,请参阅此代码,

  NSDate * now = [NSDate日期]; 
NSDate * startOfToday = nil;
NSDate * startOfThisWeek = nil;
NSDate * startOfThisMonth = nil;
NSDate * startOfThisYear = nil;
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:& startOfToday interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit startDate:& startOfThisWeek interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:& startOfThisMonth interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:& startOfThisYear interval:NULL forDate:now];

NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterFullStyle];
[formatter setTimeStyle:NSDateFormatterFullStyle];

NSLog(@%@,[formatter stringFromDate:now]);
NSLog(@%@,[formatter stringFromDate:startOfToday]);
NSLog(@%@,[formatter stringFromDate:startOfThisWeek]);
NSLog(@%@,[formatter stringFromDate:startOfThisMonth]);
NSLog(@%@,[formatter stringFromDate:startOfThisYear]);

结果:

 code> 2012年7月12日星期四下午4:36:07中欧夏令时间
2012年7月12日星期四中午12:00:00中欧夏令时间
7月7日星期日8,2012,12:00:00中欧夏令时
2012年7月1日星期日,中午12:00:00中欧夏令时
2012年1月1日星期日12:00: 00 AM中欧标准时间

这样我们可以将第一个代码缩短为:

  [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:& date1 interval:NULL forDate:date1] 
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:& date2 interval:NULL forDate:date2];

NSComparisonResult result = [date1 compare:date2];
if(result == NSOrderedAscending){
} else if(result == NSOrderedDescending){
} else {
//相同
}

请注意,在此代码中, date1 date2 将被覆盖。或者,您可以传递对 startDate 的另一个NSDate指针的引用,如上面的代码所示,其中 now 保持不变。


I want to compare two dates: date1 and date2

2011-06-06 12:59:48.994 Project[419:707] firstDate:2011-06-06 10:59:21 +0000
2011-06-06 12:59:49.004 Project[419:707] selectedData:2011-06-06 10:59:17 +0000

but these dates have different time and when I use NSOrderedSame it don't work fine, how can I solve?

my code:

NSDate *firstDate = [[appDelegate.project objectAtIndex:i]objectAtIndex:3];
NSDate *secondDate = [[appDelegate.project objectAtIndex:i]objectAtIndex:4];

NSCalendar *calendar = [NSCalendar currentCalendar];
NSInteger comps = (NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit);

NSDateComponents *date1Components = [calendar components:comps 
                                                            fromDate:firstDate];
NSDateComponents *date2Components = [calendar components:comps 
                                                            fromDate:secondDate];
NSDateComponents *date3Components = [calendar components:comps fromDate:appDelegate.selectedDate];

NSLog(@"firstDate:%@", [date1Components date]);
NSLog(@"secondDate:%@", [date2Components date]);
NSLog(@"selectedData:%@", [date3Components date]);

NSComparisonResult compareStart = [[date1Components date] compare: [date3Components date]]; 
NSComparisonResult compareEnd = [[date2Components date] compare: [date3Components date]]; 

if ((compareStart == NSOrderedAscending || compareStart == NSOrderedSame)
     && (compareEnd == NSOrderedDescending || compareEnd == NSOrderedSame))

{
    NSLog(@"inside");

Then I want to compare my dates and entry inside the "if" when date1 <= selectedDate <= date2; now I understand because I have a warning: I should add this "[date1Components date]" and it work; the problem is that I have in the NSLog null values, why??

解决方案

NSCalendar *calendar = [NSCalendar currentCalendar];
NSInteger comps = (NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit);

NSDateComponents *date1Components = [calendar components:comps 
                                                fromDate: date1];
NSDateComponents *date2Components = [calendar components:comps 
                                                fromDate: date2];

date1 = [calendar dateFromComponents:date1Components];
date2 = [calendar dateFromComponents:date2Components];

NSComparisonResult result = [date1 compare:date2];
if (result == NSOrderedAscending) {
} else if (result == NSOrderedDescending) {
}  else {
    //the same
}


There is another handy method to create for a given date the date that represents the start of a given unit: [aCalendar rangeOfUnit:startDate:interval:forDate:]
To illustrate how this method works, see this code, that easily creates the date for the beginning of the day, week, month and year for a given date (here: now).

NSDate *now = [NSDate date];
NSDate *startOfToday = nil;
NSDate *startOfThisWeek = nil;
NSDate *startOfThisMonth = nil;
NSDate *startOfThisYear = nil;
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&startOfToday interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit startDate:&startOfThisWeek interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&startOfThisMonth interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:&startOfThisYear interval:NULL forDate:now];

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterFullStyle];
[formatter setTimeStyle:NSDateFormatterFullStyle];

NSLog(@"%@", [formatter stringFromDate:now]);
NSLog(@"%@", [formatter stringFromDate:startOfToday]);
NSLog(@"%@", [formatter stringFromDate:startOfThisWeek]);
NSLog(@"%@", [formatter stringFromDate:startOfThisMonth]);
NSLog(@"%@", [formatter stringFromDate:startOfThisYear]);

result:

Thursday, July 12, 2012, 4:36:07 PM Central European Summer Time 
Thursday, July 12, 2012, 12:00:00 AM Central European Summer Time 
Sunday, July 8, 2012, 12:00:00 AM Central European Summer Time 
Sunday, July 1, 2012, 12:00:00 AM Central European Summer Time 
Sunday, January 1, 2012, 12:00:00 AM Central European Standard Time

this allows us to shorten the first code to:

[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&date1 interval:NULL forDate:date1];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&date2 interval:NULL forDate:date2];

NSComparisonResult result = [date1 compare:date2];
if (result == NSOrderedAscending) {
} else if (result == NSOrderedDescending) {
}  else {
    //the same
}

Note, that in this code, date1 and date2 will be overwritten. Alternatively you can pass in a reference to another NSDate pointer for startDate as shown in the code above, where now stays untouched.

这篇关于iOS:比较两个NSDate-s没有时间部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆