Il est assez facile d'obtenir la chaîne de date ISO 8601 (par exemple, 2004-02-12T15:19:21+00:00
) en PHP via date('c')
, mais comment l'obtenir en Objective-C (iPhone)? Existe-t-il un moyen aussi court de le faire?
Voici le long chemin que j'ai trouvé pour le faire:
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSDate *now = [NSDate date];
NSString *formattedDateString = [dateFormatter stringFromDate:now];
NSLog(@"ISO-8601 date: %@", formattedDateString);
// Output: ISO-8601 date: 2013-04-27T13:27:50-0700
Cela semble énormément de rigmarole pour quelque chose d'aussi central.
ios
nsdate
nsdateformatter
iso8601
JohnK
la source
la source
Réponses:
Utilisez
NSDateFormatter
:Et dans Swift:
la source
setLocale
important?iOS 10 introduit une nouvelle
NSISO8601DateFormatter
classe pour gérer exactement cela. Si vous utilisez Swift 3, votre code ressemblerait à ceci:la source
string
contient "2016-09-03T21: 47: 27Z".En complément de la réponse de maddy, le format du fuseau horaire devrait être "ZZZZZ" (5 fois Z) pour ISO 8601 au lieu d'un seul "Z" (qui est pour le format RFC 822). Au moins sur iOS 6.
(voir http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns )
la source
Un problème souvent négligé est que les chaînes au format ISO 8601 peuvent avoir des millisecondes et non.
En d'autres termes, "2016-12-31T23: 59: 59.9999999" et "2016-12-01T00: 00: 00" sont légitimes, mais si vous utilisez un formateur de date de type statique, l'un d'entre eux ne sera pas analysé .
À partir d' iOS 10, vous devez utiliser
ISO8601DateFormatter
qui gère toutes les variations des chaînes de date ISO 8601. Voir l'exemple ci-dessous:Pour iOS 9 et les versions antérieures, utilisez l'approche suivante avec plusieurs formateurs de données.
Je n'ai pas trouvé de réponse qui couvre les deux cas et résume cette différence subtile. Voici la solution qui y répond:
Usage:
Je recommande également de consulter l' article Apple sur les formateurs de date.
la source
Utilisez donc la catégorie de Sam Soffee sur NSDate trouvée ici . Avec ce code ajouté à votre projet, vous pouvez désormais utiliser une seule méthode sur NSDate:
Non seulement il s'agit d'une ligne, mais c'est beaucoup plus rapide que l'approche NSDateFormatter, car il est écrit en C.
la source
A partir d' IS8601 , les problèmes sont la représentation et le fuseau horaire
year-month-day time timezone
T
Voici quelques chaînes valides
Solutions
NSDateFormatter
Voici donc le format que j'utilise dans onmyway133 ISO8601
À propos de la table des symboles des champs de date d'
Z
identificationA propos du
locale
formatage des données à l'aide des paramètres régionauxÀ propos
en_US_POSIX
des questions et réponses techniques QA1480 NSDateFormatter et Internet DatesQuestions connexes intéressantes
la source
Utilisez simplement NSISO8601DateFormatter du framework Foundation.
https://developer.apple.com/documentation/foundation/nsiso8601dateformatter?language=objc
la source
Sur la base de cet essentiel: https://github.com/justinmakaila/NSDate-ISO-8601/blob/master/NSDateISO8601.swift , la méthode suivante peut être utilisée pour convertir NSDate en chaîne de date ISO 8601 au format aaaa-MM -dd'T'HH: mm: ss.SSSZ
la source
S
de la sous-seconde était la clé iciC'est un peu plus simple et met la date en UTC.
la source
Utilisation de Swift 3.0 et iOS 9.0
la source