Ruft die Anzahl der Tage zwischen zwei NSDate-Daten in einer bestimmten Zeitzone ab

Ich habe die Codes gefunden, um den Tagesunterschied zwischen zwei Daten zu berechnenHier.
Ich schreibe eine Methode:

-(NSInteger)daysWithinEraFromDate:(NSDate *) startDate toDate:(NSDate *) endDate
{
    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];
    NSInteger startDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit
                                            inUnit: NSEraCalendarUnit forDate:startDate];
    NSInteger endDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit
                                          inUnit: NSEraCalendarUnit forDate:endDate];
    return endDay-startDay;
}

Diese Methode hat ein Problem: Sie kann die Zeitzone nicht berücksichtigen. Sogar ich füge eine Zeile wie diese hinzu:

[gregorian setTimeZone:[NSTimeZone localTimeZone]];

Mein Testcode ist wie folgt:

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *strDate = @"2012-09-03 23:00:00";
    NSDate *dateStart = [dateFormat dateFromString:strDate];
    strDate = @"2012-09-04 01:00:00";
    NSDate *dateEnd = [dateFormat dateFromString:strDate];
    NSLog(@"Days difference between %@ and %@  is:  %d days",[dateFormat stringFromDate:dateStart],[dateFormat stringFromDate:dateEnd],[self daysWithinEraFromDate:dateStart toDate:dateEnd]);

Das Ergebnis ist:

Der Tagesunterschied zwischen 2012-09-03 23:00:00 und 2012-09-04 01:00:00 beträgt: 0 Tage

Ich möchte 1 Tag als Ergebnis nach der Anzahl der Mitternächte zwischen den beiden Daten erhalten. Meine Zeitzone ist GMT +8. Diese Berechnung basiert jedoch auf GMT, sodass ich die falsche Anzahl von Tagen erhalte. Gibt es überhaupt eine Lösung für dieses Problem? Vielen Dank.

Scott Lemmon's Methode kann mein Problem lösen. Ich schreibe meinen Code wie folgt um:

-(NSInteger)daysWithinEraFromDate:(NSDate *) startDate toDate:(NSDate *) endDate
{
    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];
    [gregorian setTimeZone:[NSTimeZone localTimeZone]];
    NSDate *newDate1 = [startDate dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT]];
    NSDate *newDate2 = [endDate dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT]];

    NSInteger startDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit
                                            inUnit: NSEraCalendarUnit forDate:newDate1];
    NSInteger endDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit
                                          inUnit: NSEraCalendarUnit forDate:newDate2];
    return endDay-startDay;
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage