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 Project[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 = [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");
然后,当 date1 <= selectedDate <= date2; 时,我想比较我的日期和“if”内的条目;现在我明白了,因为我有一个警告:我应该添加这个“[date1Components date]”并且它可以工作;问题是我的 NSLog 中有空值,为什么?
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??
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
还有另一种方便的方法可以为给定日期创建代表给定单元开始的日期:
[aCalendar rangeOfUnit:startDate:interval:forDate:]
要说明此方法的工作原理,请参阅此代码,它可以轻松创建给定日期的日、周、月和年的开始日期(此处:现在)。
结果:
这允许我们将第一个代码缩短为:
注意,在此代码中,
date1
和date2
将被覆盖。或者,您可以传递对startDate
的另一个 NSDate 指针的引用,如上面的代码所示,其中now
保持不变。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).
result:
this allows us to shorten the first code to:
Note, that in this code,
date1
anddate2
will be overwritten. Alternatively you can pass in a reference to another NSDate pointer forstartDate
as shown in the code above, wherenow
stays untouched.我使用了另一种方法与 NSDateFormatter 和字符串比较,比
NSDate compare 方法,但编写速度更快,并且足够灵活,可以进行各种比较:
I have used another method with NSDateFormatter and a string comparison, less smarter than
NSDate compare method but faster to write and flexible enough to do variety of comparison :
好吧,距最初的问题提出已有几年了,但可能值得一提的是
NSCalendar
现在有许多方法可以使某些日期比较问题更加直接:Okay, so it's a few years after the original question was asked, but it's probably worth mentioning that
NSCalendar
now has a number of methods that make certain date comparison questions much more straight-forward:Swift 版本,比较日期并忽略它们的时间。
Swift Version , Comparing Dates and ignoring their time.
快速更新@LuAndre 答案 5
Updating @LuAndre answer swift 5