Pro*_*ody 67 macos cocoa-touch objective-c ios
我需要知道两个NSDate实例是否都来自同一天.
有没有比获得NSDateComponents和比较日/月/年更容易/更好的方法呢?
pro*_*rmr 154
如果您的目标是iOS 8(和OS X 10.9)或更高版本,那么Joe的答案是使用NSCalendar中的新方法的更好解决方案,仅用于此目的:
-[NSCalendar isDate:inSameDayAsDate:]
Run Code Online (Sandbox Code Playgroud)
对于iOS 7或更早版本:NSDateComponents是我的首选.这样的事情怎么样:
- (BOOL)isSameDayWithDate1:(NSDate*)date1 date2:(NSDate*)date2 {
NSCalendar* calendar = [NSCalendar currentCalendar];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date1];
NSDateComponents* comp2 = [calendar components:unitFlags fromDate:date2];
return [comp1 day] == [comp2 day] &&
[comp1 month] == [comp2 month] &&
[comp1 year] == [comp2 year];
}
Run Code Online (Sandbox Code Playgroud)
Joe*_*tti 53
如果您使用的是iOS 8,则可以使用-isDate:inSameDayAsDate:.
来自NSCalendar.h:
/*
This API compares the Days of the given dates, reporting them equal if they are in the same Day.
*/
- (BOOL)isDate:(NSDate *)date1 inSameDayAsDate:(NSDate *)date2 NS_AVAILABLE(10_9, 8_0);
Run Code Online (Sandbox Code Playgroud)
请注意,由于某些原因,这不适用于Apple开发者网站上的官方文档.但它肯定是公共API的一部分.
Ben*_*man 24
(注意:看看Joe的答案,以便在iOS 8+上执行此操作)
我只使用日期格式化程序:
NSDateFormatter *dateComparisonFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateComparisonFormatter setDateFormat:@"yyyy-MM-dd"];
if( [[dateComparisonFormatter stringFromDate:firstDate] isEqualToString:[dateComparisonFormatter stringFromDate:secondDate]] ) {
…
}
Run Code Online (Sandbox Code Playgroud)
HTH.
vik*_*lla 13
在Swift中:
NSCalendar.currentCalendar().isDate(yourDate, equalToDate: yourOtherDate, toUnitGranularity: .Day)
Run Code Online (Sandbox Code Playgroud)
如果它们在同一天,它将返回true.
aap*_*rce 11
我喜欢progrmr的解决方案,但我会更进一步,并提出一个NSDate提供此方法的类别.它将使您的代码更具可读性,并且您不需要将该方法复制并粘贴到可能需要它的每个新类中 - 只需导入头文件即可.
@interface NSDate (SameDay)
- (BOOL)isSameDayAsDate:(NSDate*)otherDate;
@end
Run Code Online (Sandbox Code Playgroud)
#import "NSDate+SameDay.h"
@implementation NSDate (SameDay)
- (BOOL)isSameDayAsDate:(NSDate*)otherDate {
// From progrmr's answer...
NSCalendar* calendar = [NSCalendar currentCalendar];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents* comp1 = [calendar components:unitFlags fromDate:self];
NSDateComponents* comp2 = [calendar components:unitFlags fromDate:otherDate];
return [comp1 day] == [comp2 day] &&
[comp1 month] == [comp2 month] &&
[comp1 year] == [comp2 year];
}
@end
Run Code Online (Sandbox Code Playgroud)
然后,NSDate+SameDay.h在您的课程中导入后,您可以像这样使用它:
if ([myFirstDate isSameDayAsDate:mySecondDate]) {
// The two dates are on the same day...
}
Run Code Online (Sandbox Code Playgroud)
NSDateComponents听起来对我来说是最好的选择.另一种尝试的策略是免费将其桥接到CFDate,然后使用CFDateGetAbsoluteTime并进行减法以获得两个日期之间的时间量.但是,你必须做一些额外的数学计算,以确定时差是否在同一天登陆日期.
小智 5
我使用NSDateComponents去除时间方面然后进行比较.就像是:
if ([[self beginningOfDay:date1] isEqualToDate:[self beginningOfDay:date2]])
{
...
}
- (NSDate *)beginningOfDay:(NSDate *)date {
NSCalendar *calendar = [NSCalendar currentCalendar];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *comp = [calendar components:unitFlags fromDate:date];
return [calendar dateFromComponents:comp];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21821 次 |
| 最近记录: |