2013-08-12 2 views
1

두 날짜 사이의 날짜 수를 얻으 려하고 논리가 일정 기간 (2012 년 8 월 12 일 ~ 8 월 12 일)에 잘 작동하는 것으로 보입니다 - 364 계산에 마지막 날을 포함하면 365 일입니다. 그러나 2013 년 8 월 8 일부터 2013 년 8 월 12 일까지 플러그인하면 계산이 끝나는 날에 0이나 1이됩니다. 내가 잘못 여기서 뭐하는 거지 확실하지 무엇을 :목표 -C 날짜 차이 혼동

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를 사용하고 있는데 날짜를 제출할 형식을 알지 못해서 (2012 년 8 월 8 일, 2013 년 8 월 8 일, 2013 년 8 월 12 일 등)

+0

'convertStringToDate'의 출력과 발생하는 오류를 확인하고 있습니까? – Wain

답변

4

convertStringToDate을 단순화 할 수 있습니다. 에서 date을 가져 와서 문자열로 변환 한 다음 다시 날짜로 변환해야합니다. 당신은 간단해야한다 : 당신이 날짜 차이로 1을 추가하는 이유

- (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; 
} 

또한 불분명 해요.

- (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 일 - 2012 년 8 월 12 일 결과는 365입니다.
  • 2013 년 8 월 8 일 - 2013 년 8 월 12 일 결과는 4입니다.

왜 루틴이 돌아 왔는지는 완전히 명확하지 않습니다. convertDateToString 메쏘드 (우리에게 보여주지 않았 음) 또는 날짜 포매터의 구성 (다시 우리는 당신이 그곳에서 한 일을 알지 못합니다) 일 수도 있습니다. 그러나 위의 코드는 이들 중 하나를 필요로하지 않으며 예상대로 작동하는 것 같습니다.

+1

변환 방법이었습니다 - 유선형 덕분입니다. – PruitIgoe

0

이 기능을 사용하십시오.

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

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

} 

convertStringToDate 함수 대신이 함수를 사용하십시오.