2017-06-03 79 views
0

下面是我的比较代码:比较如果两个的NSDate对象是相同

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 ]日期] 2017年6月2日九时38分35秒0000

(LLDB)PO [[self.reminderResultsArray objectAtIndex:0]日期] 2017年5月27日9点37分48秒0000

(LLDB)PO [[self.reminderResultsArray objectAtIndex:1]日期] 2017年6月2日9点38分35秒0000

(LLDB)PO [[self.reminderResultsArray objectAtIndex:2]日期] 2017年6月2日10时09分48秒0000

(LLDB)PO [[self.reminderResultsArray objectAtIndex:3]日期] 2017年6月2日十点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.我的代码的任何问题的价值?

+0

你只关心日期部分而不想忽略时间部分? –

+0

@AndréSlotta只有日期部分 – SPUDERMAN

回答

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

'inSameDayAsDate'方法应该检查*如果两个日期在同一天* **内。 – vadian

+0

根据文件,是的,它应该检查两个日期是否在同一天。我已经用另一种方法更新了答案,看看它是否有帮助。 –

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 
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 
1

日志记录日期为descri相对于UTC(即,时区+0000)。这可能会误导你。

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

要找出为什么比较不起作用,您首先需要计算出您所在的时区中所有这些日期的月份,年份,月份和日期。那么它会很清楚。我期望-isDate:inSameDayAsDate:方法的工作方式与它应有的完全相同,并且您只是误解了您正在使用的日期的实际日期(在您的时区)。

或者,如果您确实对UTC的日子感兴趣,那么您需要使用一个日历对象,它的timeZone已设置为[NSTimeZone timeZoneWithName:@"UTC"]