playgrounds playground para obtener niños mac español cuesta cuanto apple swift cocoa-touch datetime nsdateformatter swift2

playground - Fecha/Hora Aproximación del lenguaje natural en Swift



swift playgrounds para mac (2)

Estoy intentando convertir una fecha formateada UTC de una API a un formato de aproximación legible por humanos usando Swift.

Estoy buscando algo como lo siguiente:

2015-07-14T13: 51: 05.423Z

a

Hace aproximadamente dos semanas

¿Cuál es el mejor enfoque para esto en Swift? Si bien de manera óptima esto podría formatear cadenas directamente, entiendo que esto probablemente requerirá convertir la cadena en un objeto NSDate.

Cualquier ayuda sería muy apreciada.

EDITAR: Mi pregunta ha sido identificada como un posible duplicado de otra pregunta . La siguiente solución de Tom está escrita para Swift y es mucho más elegante que crear un nuevo método con respecto a mi situación.


Necesitas dos pasos. Primero, convierta su cadena de fecha a NSDate :

let dateString = "2015-07-14T13:51:05.423Z" let df = NSDateFormatter() df.dateFormat = "yyyy-MM-dd''T''HH:mm:ss.SSSZ" let date = df.dateFromString(dateString)

(Si esa no es una representación exacta de las cadenas que obtiene, tendrá que cambiar la cadena de formato de fecha para que esto se convierta).

A continuación, use NSDateComponentsFormatter para obtener la cadena deseada:

let formatter = NSDateComponentsFormatter() formatter.unitsStyle = NSDateComponentsFormatterUnitsStyle.Full formatter.includesApproximationPhrase = true formatter.includesTimeRemainingPhrase = false formatter.allowedUnits = NSCalendarUnit.WeekOfMonthCalendarUnit if let pastDate = date { let dateRelativeString = formatter.stringFromDate(pastDate, toDate: NSDate()) }

Hoy es 28 de julio, por lo que el resultado de esa cadena es "Alrededor de 2 semanas". El atributo allowedUnits es un campo de bit, por lo que puede especificar tantos tipos de unidades como desee.


Como notas de respuesta de Tom Harrington, puede producir una representación coloquial de un momento o un intervalo de tiempo utilizando NSDateComponentsFormatter .

Sin embargo, si quiere hacer exactamente lo que la pregunta pregunta en su ejemplo, que es producir una representación coloquial de un momento en el pasado, relativo al momento presente , como para una interfaz de usuario orientada a la línea de tiempo, entonces parece que NSDateComponentsFormatter es no adecuado. Como dice la documentación de stringFromTimeInterval(_:) , el valor del intervalo de tiempo "debe ser un número finito. Los números negativos se tratan como números positivos al crear la cadena".

Por lo que puedo decir, la mejor opción es TTTTimeIntervalFormatter , una clase independiente en el FormatterKit de Matth Thompson.

He producido un patio de recreo Xcode 7, RelativeDatePlayground , que compara las salidas de la salida TTTTimeIntervalFormatter con TTTTimeIntervalFormatter . Aquí hay una tabla que muestra resultados para diferentes tiempos relativos en segundos. Como puede ver, NSDateComponentsFormatter no parece manejar bien los momentos pasados ​​o el momento presente:

-1488010 | 2 weeks ago | -1 week remaining -1468800 | 2 weeks ago | -1 week remaining -864000 | 1 week ago | 0 seconds remaining -86400 | 1 day ago | -1 day remaining -36000 | 10 hours ago | -10 hours remaining -3600 | 1 hour ago | -1 hour remaining -600 | 10 minutes ago | -10 minutes remaining -60 | 1 minute ago | -1 minute remaining -10 | 10 seconds ago | -10 seconds remaining -1 | 1 second ago | -1 second remaining -0 | just now | 0 seconds remaining 0 | just now | 0 seconds remaining 1 | 1 second from now | 1 second remaining 10 | 10 seconds from now | 10 seconds remaining 60 | 1 minute from now | 1 minute remaining 600 | 10 minutes from now | 10 minutes remaining 3600 | 1 hour from now | 1 hour remaining 36000 | 10 hours from now | 10 hours remaining 86400 | 1 day from now | 1 day remaining 864000 | 1 week from now | 1 week remaining 1468800 | 2 weeks from now | 2 weeks remaining 1488010 | 2 weeks from now | 2 weeks remaining