Frage

eine iPhone App in Objective-C Schreiben, habe ich ein Datum in Form einer Zeichenfolge (im UTC-Format, mit einem Z am Ende Null UTC zu bezeichnen Offset oder Zulu Zeit), die ich brauche in ein NSDate Objekt zu analysieren .
Ein Stück Code:

NSDateFormatter* df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"];
NSString* str = @"2009-08-11T06:00:00.000Z";
NSDate* date = [df dateFromString:str];
Das Ausführen dieses durch den Debugger, date endet nil! Ich gehe davon aus, es hat etwas mit meinem Datumsformat-Zeichenfolge zu tun.
Wie kann ich das Problem beheben, das Datum durch korrekt zu analysieren?
Ein Gedanke wäre der Z im Datumsformat wörtlichen zu machen, a la das Datumsformat Einstellung yyyy-MM-dd'T'HH:mm:ss.SSS'Z'.
Das würde funktionieren, es sei denn, die Z als Literal analysiert wird, verliert das Datum Offset-Informationen, und so ist nicht eindeutig und daher interpretierte lokale Zeit.
Zum Beispiel, wenn die Zeichenfolge war zu analysieren 2009-08-11T06: 00: 00.000Z (06.00 zulu Zeit) als 06.00 Ortszeit interpretiert werden würde, und eine falsche Offset würde dann angewendet werden. 00: 00.000-600 (00.00 zulu Zeit) mit dem Offset in Abhängigkeit von der Offset des Benutzers
Es wäre dann als 2009-08-11T06 analysiert werden. Dank!

War es hilfreich?

Lösung

Ich habe dieses Problem auch habe, ich bin nicht sicher, ob es ein API Fehler in Apples Code ist, oder mein Unverständnis, aber ich habe um es durch die Verwendung Stunde Offsets in meinem Datum Strings gearbeitet.

Wenn Sie den Code in Ihrem Beispiel zu ändern:

NSDateFormatter* df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"];
NSString* str = @"2009-08-11T06:00:00.000-0700";   // NOTE -0700 is the only change
NSDate* date = [df dateFromString:str];

Es wird nun das Datum Zeichenfolge analysieren. Natürlich sind die -0700 Stunden ist mein versetzt, dann würden Sie es zu Ihrem ändern. Hoffe, das hilft.

Andere Tipps

Die meisten Antworten vorschlagen, Sie ‚Z‘ als Literalzeichen zu behandeln. Tun Sie dies nicht!

Die Z bedeutet tatsächlich, dass das Datum von 0 bis UTC Offset (+0000).

Dies ist nach der Zeitzone Format ISO8601 :

  

ISO 8601 Zeitzonenformat: Eine konstante, spezifische Offset von UTC, die immer das gleiche Format außer UTC hat sich ( "Z")

.      

"- 08.00 Uhr"

     

"Z"

Was Sie tun möchten, das folgende Format für Ihre NSDateFormatter ist zu verwenden:

 NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
                                  // 2013-11-18T23:00:00.324Z
                                  [formatter setTimeZone:[NSTimeZone localTimeZone]];
                                  [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"];
                                  return formatter;

Durch die Wiederholung der Z fünfmal, sagen Sie die Formatierungs ISO8601 zu verwenden, wenn die Zeichenfolge Parsen.

Bonus:

  • Verwenden 2.59 Z s für RFC 822 GMT-Format.
  • Mit vier Z s für lokalisierte GMT-Format.

Weitere Informationen finden Sie auf diesem Dokument.

Ich glaube, Sie einfache Anführungszeichen um die Z im Format-String, weil die Z bedeutet eigentlich etwas an den Formatierer setzen müssen, und Sie wollen es stattdessen eine wörtliche Zeichen darzustellen.

    [df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];

Es gibt keine Notwendigkeit, um die Zeichenfolge zu manipulieren. Stellen Sie einfach die Zeitzone auf dem NSDateFormatter (und das Gebietsschema, während Sie gerade dabei sind):

NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[formatter setLocale:[NSLocale systemLocale]];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];

Und Datum Strings nach Bedarf analysieren:

NSDate * value = [formatter dateFromString:@"2012-03-01T23:08:25.000Z"];
NSLog(@"%@", value); // prints 2012-03-01 23:08:25 +0000

Sie können diese Methode verwenden Datum von UTC zu erhalten.

+ (NSDate*)getDateFromUTCDateTimeString:(NSString*)dateString {

NSDateFormatter *isoDateFormatter = [[NSDateFormatter alloc] init];

[isoDateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];

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

NSDateFormatter *userFormatter = [[NSDateFormatter alloc] init];

[userFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

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

NSDate *date = [isoDateFormatter dateFromString:dateString];

return [dateFormatter dateFromString:[userFormatter stringFromDate:date]];

}

Dies kann Ihnen helfen .. das „Z“ ist eine wörtliche für die Zeitzone Code. versuchen „o“ (der Buchstabe, nicht Null) verwendet wird. Die wörtliche "o" bedeutet UTC Offset. Ich lief in dieses eine Weile zurück, ich hoffe das Ihnen geholfen.

-(NSDate*)dateFromZulu:(NSString*)str {
    if (str == nil) {
        NSLog(@"Error getting date");
        return [NSDate date];
    }

    NSDateFormatter *f = [[NSDateFormatter alloc] init];
    [f setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss Z"];
    NSDate *ret = [f dateFromString:[str stringByReplacingOccurrencesOfString:@"Z" withString:@" +0000"]];
    [f release];

    if (ret == nil) {
        ret = [NSDate date];
        NSLog(@"Error formatting date (%@)",str);       
    }   
    return ret;     
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top