Cocoa-Touch:我如何看待两个NSD在同一天?

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)

  • 或者另一种方式:` - (BOOL)isDate:(NSDate*)date1 sameDayAsDate:(NSDate*)date2` (6认同)
  • 签名应该是: - (BOOL)isSameDayWithDate1:​​(NSDate*)date1 date2:(NSDate*)date2 { (5认同)
  • - (BOOL)日期:(NSDate*)date1 isTheSameDayAsDate :( NSDate*)date2读得好多了:) (3认同)

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的一部分.

  • 这应该是新接受的答案. (10认同)

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.

  • 这甚至比使用NSDateComponents更糟糕,因为格式化程序必须首先将日期分解为组件,然后创建两个字符串,然后比较字符串. (9认同)
  • 您对"更好"的指标是什么?我认为这比可比较的NSDateComponents代码"更容易",因为它更简洁,易于维护. (9认同)
  • 我一直在使用dateComponents方法,但这更聪明.更短的代码更好,如果性能是一个问题,我可以缓存NSDateFormatter. (5认同)
  • 为我工作,善良而聪明.从我所有的NSCalendar开销中节省了我. (2认同)

vik*_*lla 13

在Swift中:

NSCalendar.currentCalendar().isDate(yourDate, equalToDate: yourOtherDate, toUnitGranularity: .Day)
Run Code Online (Sandbox Code Playgroud)

如果它们在同一天,它将返回true.


aap*_*rce 11

我喜欢progrmr的解决方案,但我会更进一步,并提出一个NSDate提供此方法的类别.它将使您的代码更具可读性,并且您不需要将该方法复制并粘贴到可能需要它的每个新类中 - 只需导入头文件即可.

的NSDate + SameDay.h

@interface NSDate (SameDay)
- (BOOL)isSameDayAsDate:(NSDate*)otherDate;
@end
Run Code Online (Sandbox Code Playgroud)

的NSDate + SameDay.m

#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)


fbr*_*eto 7

NSDateComponents听起来对我来说是最好的选择.另一种尝试的策略是免费将其桥接到CFDate,然后使用CFDateGetAbsoluteTime并进行减法以获得两个日期之间的时间量.但是,你必须做一些额外的数学计算,以确定时差是否在同一天登陆日期.

  • `NSDate`有这个很好的方法:`timeIntervalSinceDate:`因此你甚至不需要corefoundation. (4认同)
  • 仅时间间隔不足以确定两个日期是否在同一天.晚上11:59和12:01 AM只有2分钟的间隔,但不同的日子.您可以使用时间间隔快速排除> 24小时的间隔,然后使用NSDateComponents进行全面检查. (3认同)
  • NSDateComponents是最好的选择,因为这样可以自动处理时区和夏令时等事情. (2认同)

小智 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)