2012-03-23 3 views
0

Ein Server sendet mir Daten in der Form 2012-04-30T10: 00: 00 (als Zeichenfolge), die zum Hinzufügen eines Eintrags zum Kalender verwendet werden. Ich verwende den folgenden Code, um das Datum von einer Zeichenfolge in ein NSDate zu konvertieren, das dann verwendet wird, um das Startdatum des Kalenderereignisses festzulegen.Wie verarbeitet man ein RFC3339-Datum mit Z und ohne Z?

Die Einträge für 2012-04-30T10: 00: 00 und 2012-04-30T10: 00: 00Z werden gleichzeitig im Kalender hinzugefügt. Was soll ich tun, damit, wenn das Z vorhanden ist, sie als UTC-Zeiten hinzugefügt werden, oder wenn sie nicht vorhanden sind, werden sie als lokale Zeiten hinzugefügt?

+ (NSDate*) convertDate: (NSString*) fromString 
{ 
    [NSTimeZone resetSystemTimeZone]; 
    NSLocale *enUSPOSIXLocale; 
    NSDateFormatter *sRFC3339DateFormatter = [[NSDateFormatter alloc] init]; 
    enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 

    [sRFC3339DateFormatter setLocale:enUSPOSIXLocale]; 
    [sRFC3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; 
    [sRFC3339DateFormatter setTimeZone:[NSTimeZone systemTimeZone]]; 

    NSDate *date = [sRFC3339DateFormatter dateFromString:fromString]; 
    return date; 
} 

Antwort

0

Legen Sie die Zeitzone auf Ihrem Formatierer auf UTC. Dies wird der Trick:

[sRFC3339DateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 

bearbeiten: Sie müssen die Zeitzone UTC setzen, wenn die Z vorhanden ist, andernfalls das System Zeitzone verwenden, wie:

+ (NSDate*) convertDate: (NSString*) fromString 
{ 
    [NSTimeZone resetSystemTimeZone]; 
    NSLocale *enUSPOSIXLocale; 
    NSDateFormatter *sRFC3339DateFormatter = [[NSDateFormatter alloc] init]; 
    enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 

    [sRFC3339DateFormatter setLocale:enUSPOSIXLocale]; 
    [sRFC3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; 
    if([fromString characterAtIndex:[fromString length]-1] == 'Z') { 
     [sRFC3339DateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
    } 
    else { 
     [sRFC3339DateFormatter setTimeZone:[NSTimeZone systemTimeZone]]; 
    } 

    NSDate *date = [sRFC3339DateFormatter dateFromString:fromString]; 
    return date; 
} 
+0

Beide Termine kommen out the selbe dh 2012-04-30T10: 00: 00 und 2012-04-30T10: 00: 00Z werden gleichzeitig mit dem Kalender hinzugefügt (erscheint als 3 Uhr morgens). – Gruntcakes

+0

Ja, Sie müssen die Zeitzone entweder auf UTC oder auf die Systemzeitzone einstellen, abhängig davon, ob das Z dort ist. Siehe meine aktualisierte Antwort. – zpasternack