以下是我的比较代码:
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.我的代码有问题吗?
答案 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