IOS如何将日期与其他日期进行比较?

IOS如何将日期与其他日期进行比较?,ios,xml,compare,nsdate,Ios,Xml,Compare,Nsdate,我有一个包含XML数据列表的web服务。其中一个元素是“UpdateTimeStampGMT”。我已经在这个元素中检索了这个参数,当我注销它进行检查时,它看起来像这样 UpdateTimestampGMT = "2015-11-03T01:00:59.503"; 但现在的问题是,我想利用这个日期来检查这个日期是4天前的日期还是3天前的日期,如果它是有效的,我想检索块中属于正确日期的其他元素 以下是编码: int minusThreeDayopenSSLCount = 0; i

我有一个包含XML数据列表的web服务。其中一个元素是
“UpdateTimeStampGMT”
。我已经在这个元素中检索了这个参数,当我注销它进行检查时,它看起来像这样

 UpdateTimestampGMT = "2015-11-03T01:00:59.503";
但现在的问题是,我想利用这个日期来检查这个日期是4天前的日期还是3天前的日期,如果它是有效的,我想检索块中属于正确日期的其他元素

以下是编码:

   int minusThreeDayopenSSLCount = 0;

    int bluecolor = 0;
    NSDate *now = [NSDate date];
    NSDate *threeDaysAgo = [now dateByAddingTimeInterval:-3*24*60*60];
//This is the data when i NSLOG threeDaysAgo: 2015-10-29 09:06:40 +0000

for (NSDictionary *feed in feeds) {
        if ([feed[@"Classification"] isEqualToString:@"Activity Summary - OpenSSL \"HeartBleed\" Scanning"] && [feed[@"UpdateTimestampGMT"] isEqualToString:threeDaysAgo]) {
            minusThreeDayopenSSLCount ++;
        }
    }
 NSLog(@"-3 Total openSSLCount count is (green):  %d",minusThreeDayopenSSLCount);
当I
NSLOG

minus threedaysopensslcount看起来是这样的,这是不正确的

-->2015-11-05 17:06:44.443 FYP_IOS_应用程序[928:444918]-3总OpenSSL计数为(绿色):0

当我改变

if ([feed[@"Classification"] isEqualToString:@"Activity Summary - OpenSSL \"HeartBleed\" Scanning"] && [feed[@"UpdateTimestampGMT"] isEqualToString:threeDaysAgo]) {
//            minusThreeDayopenSSLCount++;
//        }

它给了我这个错误:

2015-11-05 17:38:08.138 FYP_IOS_应用程序[938:448845]-[\uu NSCFString isEqualToDate:]:未识别的选择器发送到实例0x15cd90340
2015-11-05 17:38:08.139 IOS_应用程序[938:448845]***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu NSCFString isEqualToDate::]:未识别的选择器发送到实例0x15cd90340'

您可以这样做:

NSDate *now = [NSDate date];
NSDate *threeDaysAgo = [now dateByAddingTimeInterval:-3*24*60*60];

NSDateFormatter *df = [NSDateFormatter new];
df.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS";

NSString *threeDaysAgoAsAString = [df stringFromDate:threeDaysAgo];

for (NSDictionary *feed in feeds) {
  if ([feed[@"Classification"] isEqualToString:@"Activity Summary - OpenSSL \"HeartBleed\" Scanning"] && [feed[@"UpdateTimestampGMT"] isEqualToString:threeDaysAgoAsAString]) {
    minusThreeDayopenSSLCount ++;
  }
}
总的来说,我认为您不应该比较字符串来检查日期是否相等,因为这意味着两个日期值必须完全相同(例如,“2015-11-03T01:00:59.503”!=“2015-11-03T01:00:59.502”)。。。

更新

试试这个:

NSCalendar *calendar = [NSCalendar currentCalendar];

NSDateComponents *components = [NSDateComponents new];
components.day = -3; // days to subtract

NSDate *now = [NSDate date];
NSDate *threeDaysAgo = [calendar dateByAddingComponents:components toDate:now options:0];

NSUInteger threeDaysAgoComparisonValue = [calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:threeDaysAgo];

NSDateFormatter *df = [NSDateFormatter new];
df.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS";

for (NSDictionary *feed in feeds) {
  if ([feed[@"Classification"] isEqualToString:@"Activity Summary - OpenSSL \"HeartBleed\" Scanning"]) {
    NSDate *updateTimestampGMT = [df dateFromString:feed[@"UpdateTimestampGMT"]];
    NSUInteger dateComparisonValue = [calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:updateTimestampGMT];
    if (dateComparisonValue == threeDaysAgoComparisonValue) {
      minusThreeDayopenSSLCount++;
    }
  }
}


另一次更新

如果您的目标是>=iOS 8,则可以获得更简单的
threeDaysAgo
日期:

NSDate *threeDaysAgo = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitDay value:-3 toDate:[NSDate date] options:0];


希望最终编辑:)


您正在将
NSString*
NSDate*
进行比较。谢谢。是的,或者你有其他方法来比较这两个日期吗?我只需要比较一下日期就行了。不需要比较落后的时间。有一个包含参数供我比较吗?假设你有8月20日。三天前是8月17日。那么8月17日00:01会匹配,8月17日23:59也会匹配?是的,它也会匹配,我只需要当天的所有数据。时间不重要,你能告诉我如何控制日期吗?您编写的上述代码是正确的,但仍然无法进行比较,正如您所说,它不等于落后的时间。请帮忙。
NSDate *threeDaysAgo = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitDay value:-3 toDate:[NSDate date] options:0];
NSCalendar *calender = [NSCalendar currentCalendar];
NSDate *threeDaysAgo = [calender dateByAddingUnit:NSCalendarUnitDay value:-3 toDate:[NSDate date] options:0];

NSDateFormatter *df = [NSDateFormatter new]; // to create the dates in the for loop
df.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS";

for (NSDictionary *feed in feeds) {
  if ([feed[@"Classification"] isEqualToString:@"Activity Summary - OpenSSL \"HeartBleed\" Scanning"]) {
    NSDate *updateTimestampGMT = [df dateFromString:feed[@"UpdateTimestampGMT"]];
    if ([calender isDate:updateTimestampGMT inSameDayAsDate:threeDaysAgo]) {
      minusThreeDayopenSSLCount++;
    }
  }
}