Busqué este Wikipedia article para ver cómo funciona realmente el ISO-8601. No soy un experto en Cocoa, pero apuesto a que si puede analizar esa cadena y extraer el componente de hora, minuto, segundo, día, etc., conseguirlo en un NSTimeInterval debería ser fácil. La parte difícil es analizarla. Probablemente lo haga de la siguiente manera:
Primero, divida la cadena en dos cadenas separadas: una que represente los días y otra que represente los tiempos. NSString tiene un método de instancia componentsSeparatedByString:. NSString que devuelve un NSArray de subcadenas de su NSString fábrica, separados por el parámetro que se pasa en Sería algo parecido a esto:
NSString* iso8601 = /*However you're getting your string in*/
NSArray* iso8601Parts = [iso8601 componentsSeparatedByString:@"T"];
A continuación, buscar el primer elemento de iso8601Parts para cada de los posibles indicadores de duración del día (Y, M, W y D). Cuando encuentre uno, tome todos los dígitos precedentes (y posiblemente un punto decimal), colóquelos en un flotador y guárdelos en algún lugar. Recuerde que si solo había un elemento de tiempo, entonces iso8601Parts [0] será la cadena vacía.
Luego, haga lo mismo buscando partes de tiempo en el segundo elemento de iso8601Parts para posibles indicadores de tiempo (H, M, S). Recuerde que si solo hubiera un componente de día (es decir, no hubiera un carácter 'T' en la cadena original), entonces iso8601Parts solo será de longitud uno, y un intento de acceder al segundo elemento causará una excepción de fuera de límites. .
Un NSTimeInterval es solo un almacenamiento prolongado de varios segundos, de modo que convierta las piezas individuales que extrajo en segundos, agréguelas juntas, guárdelas en su NSTimeInterval, y listo.
Lo siento, sé que me pediste una forma "fácil" de hacerlo, pero en función de mi (evidentemente ligera) búsqueda y conocimiento de la API, esta es la forma más fácil de hacerlo.
escribir un pequeño analizador no era exactamente lo que tenía en mente cuando comencé a buscar una solución fácil, pero parece que de hecho no hay otra manera. Pensé que podría haber un truco usando una cadena de formato especial con NSDateFormatter, pero parece que no funciona con intervalos de tiempo. De todos modos, terminé escribiendo un analizador similar. Gracias a todos por ayudar. – Zargony
Una cosa pequeña a tener en cuenta con el ejemplo de código anterior (sí, me doy cuenta de que probablemente fue para demostrar un punto y no para el consumo real). El estándar ISO 8601 permite que los valores de duración se especifiquen como valores fraccionarios (es decir, 1.5, 0.6, etc.) que pueden delimitarse mediante "." o ",". –