¿Qué formato de cadena utilizo para milisegundos en cadenas de fecha en iPhone?

100

Estoy obligado a analizar cadenas en un formato que incluye milisegundos. ¿Qué cadena de formato utilizo para obtener el valor de fecha correcto?

Por ejemplo, supongamos que tengo una cadena con el siguiente valor: "2011-06-23T13: 13: 00.000"

¿Qué cadena de formato paso a mi NSDateFormatter en el siguiente código?

NSString *dateValue = @"2011-06-23T13:13:00.000";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSString *formatString = @"yyyy-MM-dd'T'HH:mm:ss.???";
[formatter setDateFormat:formatString];
NSDate *date = [formatter dateFromString:dateValue];

¿Qué uso en lugar de ??? en el código de arriba?

atrapado
fuente

Respuestas:

211

Es SSS, según la especificación Unicode Locale Data Markup Language .

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

De manera más general, use cualquier número de caracteres S en mayúsculas para obtener esa cantidad de lugares decimales en el componente de fracciones de segundo. (Por ss.Slo tanto , mostrará la hora a la décima de segundo más cercana, por ejemplo).

Simon Whitaker
fuente
2
Me preguntaba si sabes cómo puedo hacer un análisis indulgente de los milisegundos. La fecha puede tener 6, 7 o incluso ningún milisegundo. Podría usar expresiones regulares, pero me preguntaba si esto se puede hacer de inmediato con una cadena de formato adecuada.
Cyupa
De esta forma, el número máximo de S es tres, por ejemplo, SSS. Si agrega más, solo obtendrá ceros, por ejemplo, para el timeIntervalSince1970 de 1415986217.544384 y .SSSSSS obtendrá .544000, por lo que no es una gran solución.
Malhal
@Cyupa Un milisegundo es solo 1/1000 de segundo. 6 lugares decimales son microsegundos y 1 lugar decimal son decisegundos. - Usar milisegundos para cualquier número de decimales es tan incorrecto como usarlo literalmente para algo en sentido figurado; todavía puedes hacerlo, pero eso está cambiando el significado de la palabra.
Liggliluff
4

Debe pasar el mismo número de 'S' al final, por ejemplo, Mi fecha fue '2015-11-17T03: 36: 45.041503Z' y usé 'aaaa-MM-dd'T'HH: mm: ss.SSSSSSz' formateador, me refiero a ver el número de 'S' es 6 como 6 dígitos en la fecha.

Prakash Raj
fuente
Lo que se formateará para obtener nanosegundos en microsegundos en lugar de milisegundos. He intentado con 'aaaa-MM-dd'T'HH: mm: ss.SSSSSSz' y 'aaaa-MM-dd'T'HH: mm: ss.SSSSSSSSSz' y no funciona.
IndexOutOfDevelopersException
-1

utilizar SSSpara tres lugares decimales de un segundo

"yyyy-MM-dd'T'HH:mm:ss.SSS"
harryovers
fuente
Eso falla. No tengo fecha de regreso.
ageektrapped