比较两个NSDate对象是否相同

时间:2017-06-03 10:52:27

标签: ios objective-c

以下是我的比较代码:

 int countTrue = 0;
 //NSDate *datee = [[self.reminderResultsArray objectAtIndex:0] date];

for(int i = 0; i < self.reminderResultsArray.count; i++){
    if([[NSCalendar currentCalendar] isDate:self.actualSelectedDate inSameDayAsDate:[[self.reminderResultsArray objectAtIndex:i] date]]){
        countTrue++;
        NSLog(@"Count true: %d", countTrue);
    } 
}

以下是我self.reminderResults.array中的数据:

  

(lldb)po [[self.reminderResultsArray objectAtIndex:1] date]   2017-06-02 09:38:35 +0000

     

(lldb)po [[self.reminderResultsArray objectAtIndex:0] date]   2017-05-27 09:37:48 +0000

     

(lldb)po [[self.reminderResultsArray objectAtIndex:1] date]   2017-06-02 09:38:35 +0000

     

(lldb)po [[self.reminderResultsArray objectAtIndex:2] date]   2017-06-02 10:09:48 +0000

     

(lldb)po [[self.reminderResultsArray objectAtIndex:3] date]   2017-06-02 10:12:30 +0000

     

(lldb)po [[self.reminderResultsArray objectAtIndex:4] date]   2017-06-03 08:49:33 +0000

我的self.actualSelectedDate值为:

po self.actualSelectedDate
2017-06-02 16:00:00 +0000

右边,countTrue值应为3,但它只返回值1.我的代码有问题吗?

4 个答案:

答案 0 :(得分:1)

如果您观察日志,那么时间会有所不同,因为NSCalender方法会将它们视为不同的日期。

如果您只想进行日期比较,请先使用日期格式化dd / mm / yyyy创建日期对象,然后比较日期。

或者您可以检查日期月份和年份组件

+ (BOOL)isSameDayWithDate1:(NSDate*)date1 date2:(NSDate*)date2 {
    NSCalendar* calendar = [NSCalendar currentCalendar];

    unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth |      NSCalendarUnitDay;
    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];
}

答案 1 :(得分:1)

记录日期时描述相对于UTC(即时区+0000)。这可能会误导你。

您从[NSCalendar currentCalendar]获取的日历对象将使用您系统的当前时区。除非您的时区是UTC,否则表示输出中显示的月份日期不是与-isDate:inSameDayAsDate:比较相关的月份日期。 (在一般情况下,根据时区,日期的字符串表示形式可能与月中的日期不同,但可能会有所不同。)

要弄清楚为什么比较不符合你的想法,你首先需要弄清楚你所在时区所有这些日期的年,月和日。。然后它会很清楚。我希望-isDate:inSameDayAsDate:方法完全符合预期,你只是误解了你工作日期的实际日期(在你的时区)。

或者,如果您真的对UTC中的日期感兴趣,那么您需要使用timeZone已设置为[NSTimeZone timeZoneWithName:@"UTC"]的日历对象。

答案 2 :(得分:0)

如果您只关心NSDate对象的日期部分,可以这样做:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"

let actualSelectedDateString = "2017-06-02 16:00:00 +0000"
let actualSelectedDate = dateFormatter.dateFromString(actualSelectedDateString)!

let dateStrings = ["2017-06-02 09:38:35 +0000",
                   "2017-05-27 09:37:48 +0000",
                   "2017-06-02 09:38:35 +0000",
                   "2017-06-02 10:09:48 +0000",
                   "2017-06-02 10:12:30 +0000",
                   "2017-06-03 08:49:33 +0000"]

let dates = dateStrings.map({dateFormatter.dateFromString($0)!})

let calendar = NSCalendar.currentCalendar()
let count = dates.filter({calendar.isDate($0, inSameDayAsDate: actualSelectedDate)}).count

答案 3 :(得分:0)

试试这个,

    int countTrue = 0 ; 

    NSString  *actualSelectedDateAsString = @"2017-06-02 16:00:00 +0000";

    NSArray   *reminderResultsArray = @[@"2017-06-02 09:38:35 +0000",
                                      @"2017-05-27 09:37:48 +0000",
                                      @"2017-06-02 09:38:35 +0000",
                                      @"2017-06-02 10:09:48 +0000",
                                      @ "2017-06-02 10:12:30 +0000",
                                      @"2017-06-03 08:49:33 +0000"];

//  use date formatter to convert string to date and set the date format as per your requirement.

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"]; 

    NSDate *actualSelectedDate = [dateFormatter dateFromString:actualSelectedDateAsString]; // convert string to date.


    for (int i=0 ; i<reminderResultsArray.count ; i++){

        if( [[NSCalendar currentCalendar]isDate:actualSelectedDate inSameDayAsDate:[dateFormatter dateFromString:[reminderResultsArray objectAtIndex:i]]]){

            countTrue++;

            NSLog(@"Count true: %d", countTrue);
        }

    }

    NSLog(@"Count true: %d", countTrue); // result would be 4