1

2 つの日付の間の日数を取得しようとしていますが、ロジックは幅広い日付 (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ます。datefrom を取得し、それを文字列に変換してからNSTextCheckingResult、日付に変換し直す必要はありません。あなたは単にすべきです:

- (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 に答える