1

我正在尝试获取两个日期之间的天数,并且我的逻辑似乎适用于各种日期 - 比如 2012 年 8 月 12 日 - 2013 年 8 月 12 日 - 如果我包括结束日,它返回 364 天,365 天在计算中。但是,如果我插入 2013 年 8 月 8 日 - 2013 年 8 月 12 日,我会得到 0,如果将结束日期添加到计算中,则会得到 1。不知道我在这里做错了什么:

NSString* strNow = @"August 12, 2013";
NSString* strThen = @"August 8, 2012";

NSString* strNumOfDays = [dateManager getDateDifference:strThen :strNow];

方法

- (NSString*) getDateDifference : (NSString*) startDate : (NSString*) endDate {

    //convert strings to dates
    NSDate* dateStart = [self convertStringToDate:startDate];
    NSDate* dateEnd = [self convertStringToDate:endDate];

    //check to make sure the second date is later than the first

    //get the number of days between
    NSCalendar* gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents* components = [gregorianCalendar components:NSDayCalendarUnit fromDate:dateStart toDate:dateEnd options:0];

    //the plus one is for including the endDate in the count
    return [NSString stringWithFormat:@"%i", [components day]+1];
}

字符串转日期方法

- (NSDate*) convertStringToDate : (NSString*) strToConvert {

    NSError* error = nil;
    NSDataDetector* detector = [NSDataDetector dataDetectorWithTypes:(NSTextCheckingTypes)NSTextCheckingTypeDate error:&error];
    NSArray* arrDateMatches = [detector matchesInString:strToConvert options:0 range:NSMakeRange(0, [strToConvert length])];

    for (NSTextCheckingResult* match in arrDateMatches) {
        strToConvert =  [self convertDateToString:match.date];
    }

    NSDate* myDate = [dateFormatter dateFromString:strToConvert];
    return  myDate;
}

@Wain - 转换按预期工作。@Rob - 我正在使用 NSTextCheckingTypes 因为我不知道提交日期的格式是什么 - 它可能是 2013 年 8 月 12 日、2013 年 8 月 8 日、2013 年 8 月 12 日等。

4

2 回答 2

4

您可以简化convertStringToDate. 您不必费心将datefromNSTextCheckingResult转换为字符串,然后将其转换回日期。你应该简单地:

- (NSDate*) convertStringToDate : (NSString*) string
{
    NSError *error = nil;
    NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:(NSTextCheckingTypes)NSTextCheckingTypeDate error:&error];
    if (error)
        NSLog(@"%s: dataDetectorWithTypes error: %@", __FUNCTION__, error);

    NSTextCheckingResult* match = [detector firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];

    return match.date;
}

我也不清楚你为什么要增加1日期差异。我倾向于:

- (NSString*) getDateDifferenceBetweenStart:(NSString*)startDate end:(NSString*) endDate
{
    //convert strings to dates
    NSDate* dateStart = [self convertStringToDate:startDate];
    NSDate* dateEnd = [self convertStringToDate:endDate];

    //get the number of days between
    NSCalendar* gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents* components = [gregorianCalendar components:NSDayCalendarUnit fromDate:dateStart toDate:dateEnd options:0];

    return [NSString stringWithFormat:@"%i", [components day]];
}

请注意,我正在使用更常见的语法来识别参数的名称:

NSString *difference = [self getDateDifferenceBetweenStart:strThen end:strNow]);

因此,这样做,我得到了预期的结果:

  • 2012 年 8 月 12 日 - 2013 年 8 月 12 日导致365.
  • 2013 年 8 月 8 日 - 2013 年 8 月 12 日,结果为4.

这并不完全清楚为什么您的例程会返回它所做的事情。这可能是您的convertDateToString方法(您没有向我们展示),或者您的日期格式化程序的配置(同样,我们也不知道您在那里做了什么)。但是上面的代码不需要其中任何一个,并且似乎可以按预期工作。

于 2013-08-12T18:57:58.310 回答
0

使用此功能:

- (NSDate*) convertStringToDate : (NSString*) strToConvert {

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateStyle = NSDateFormatterLongStyle;
    dateFormatter.timeStyle = NSDateFormatterNoStyle;
    NSDate* myDate = [dateFormatter dateFromString:strToConvert];
    return  myDate;

}

而不是你的 convertStringToDate 函数使用这个函数。

于 2013-08-12T18:55:36.603 回答