Es bastante fácil obtener la cadena de fecha ISO 8601 (por ejemplo, 2004-02-12T15:19:21+00:00
) en PHP a través de date('c')
, pero ¿cómo se obtiene en Objective-C (iPhone)? ¿Existe una forma igualmente corta de hacerlo?
Aquí está el camino largo que encontré para hacerlo:
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
Parece una tremenda confusión para algo tan central.
ios
nsdate
nsdateformatter
iso8601
JohnK
fuente
fuente
Respuestas:
Utilizar
NSDateFormatter
:Y en Swift:
fuente
setLocale
importante?iOS 10 introduce una nueva
NSISO8601DateFormatter
clase para manejar precisamente esto. Si está utilizando Swift 3, su código sería algo como esto:fuente
string
contiene "2016-09-03T21: 47: 27Z".Como complemento a la respuesta de Maddy, el formato de zona horaria debería ser "ZZZZZ" (5 veces Z) para ISO 8601 en lugar de una sola "Z" (que es para el formato RFC 822). Al menos en iOS 6.
(ver http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns )
fuente
Un problema que a menudo se pasa por alto es que las cadenas en formato ISO 8601 pueden tener milisegundos o no.
En otras palabras, tanto "2016-12-31T23: 59: 59.9999999" y "2016-12-01T00: 00: 00" son legítimos, pero si está utilizando un formateador de fecha de tipo estático, uno de ellos no se analizará .
A partir de iOS 10 , debe usar
ISO8601DateFormatter
que maneje todas las variaciones de cadenas de fecha ISO 8601. Vea el ejemplo a continuación:Para iOS 9 y versiones anteriores, utilice el siguiente enfoque con varios formateadores de datos.
No he encontrado una respuesta que cubra ambos casos y abstraiga esta sutil diferencia. Aquí está la solución que lo aborda:
Uso:
También recomiendo consultar el artículo de Apple sobre formateadores de fecha.
fuente
Así que use la categoría de Sam Soffee en NSDate que se encuentra aquí . Con ese código agregado a su proyecto, a partir de ese momento puede usar un solo método en NSDate:
No solo es una línea, es mucho más rápido que el enfoque NSDateFormatter, ya que está escrito en C.
fuente
Desde IS8601 , los problemas son la representación y la zona horaria
year-month-day time timezone
T
Aquí hay algunas cadenas válidas
Soluciones
NSDateFormatter
Así que aquí está el formato que estoy usando en onmyway133 ISO8601
Acerca de la tabla de símbolos del campo de fecha del
Z
identificadorAcerca del
locale
formato de datos mediante la configuración regionalAcerca de
en_US_POSIX
preguntas y respuestas técnicas QA1480 NSDateFormatter y fechas de InternetInteresantes consultas relacionadas
fuente
Simplemente use NSISO8601DateFormatter del marco Foundation.
https://developer.apple.com/documentation/foundation/nsiso8601dateformatter?language=objc
fuente
Basado en esta esencia: https://github.com/justinmakaila/NSDate-ISO-8601/blob/master/NSDateISO8601.swift , el siguiente método se puede utilizar para convertir NSDate a la cadena de fecha ISO 8601 en el formato de aaaa-MM -dd'T'HH: mm: ss.SSSZ
fuente
S
para el sub-segundo fue clave aquíEsto es un poco más simple y pone la fecha en UTC.
fuente
Usando Swift 3.0 y iOS 9.0
fuente