web-dev-qa-db-fra.com

Conversion de fuseau horaire NSDateFormatter pour iPhone

J'essaie de créer un formateur qui convertira le format de date affiché en un objet NSDate:

NSString *dateStr = @"2010-06-21T19:00:00-05:00";
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
NSDate *date = [dateFormat dateFromString:dateStr];  

Le problème est le fuseau horaire -05: 00, qui n'est pas analysé correctement avec le format ci-dessus. Aucune suggestion?

33
John Muchow

Honnêtement, vous n'aurez qu'à modifier les données source (en supprimant les deux-points) avant de les exécuter via le formateur. Votre chaîne de date d'origine n'est pas standard et aucune des chaînes de format de fuseau horaire ne fonctionnera correctement dessus.

Vous pouvez voir les entrées valides sur unicode.org .

ZZZ par ex. "-0500"

ZZZZ par ex. "GMT-05: 00"

Rien pour "-05: 00"

30
chrissr

Pour traiter le fuseau horaire avec les deux points, il vous suffit d'utiliser 5 'Z's. Il s'agit d'un format de date assez courant, le format ISO-8601. Cela ne fonctionnera que sur iOS 6.x +

-(NSDate *) dateFromString:(NSString *)string {

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];

    return [formatter dateFromString:string];
}
64
brynbodayle

Peut-être que j'ai raté quelque chose mais ZZ a fonctionné pour moi. J'ai utilisé:

@"yyyy-MM-dd'T'HH:mm:ss.SSSZZ"

for

2014-02-27T08:00:00.000+04:00
2
DanSkeel

Il s'agit du format d'heure par défaut que j'ai obtenu d'un backend Sinatra ActiveRecord. Voici ma solution.

-(NSDate *) dateFromString:(NSString *)string{
    NSMutableString * correctedDateString = [[NSMutableString alloc] initWithString:string];
    [correctedDateString deleteCharactersInRange: NSMakeRange(22, 1)];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];

    return [formatter dateFromString:correctedDateString];
}
1
Logan

C'est la seule solution qui a fonctionné pour moi:

[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];
1
Dave Cole

5 ZZZZZ - voici une catégorie que j'ai écrite avec un échantillon de GMT à BST

https://github.com/clearbrian/NSDateFormatter_ISO_8601

0
brian.clear