Al establecer doesRelativeDateFormatting = YES, stringFromDate devuelve nil

En la documentation de NSDateFormatter,

Si un formateador de date utiliza un formatting de date relativo, cuando sea posible, reemplaza el componente de date de su salida con una frase, como "hoy" o "mañana", que indica una date relativa.

Estoy usando el siguiente código:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = [NSDateFormatter dateFormatFromTemplate:@"EEEE dMMMM',' hma" options:0 locale:[NSLocale currentLocale]]; formatter.doesRelativeDateFormatting = YES; NSLog(@"Date: %@", [formatter stringFromDate:[NSDate date]]); 

Registra Date:

Pero al comentar formatter.doesRelativeDateFormatting = YES; la salida sale correcta.

Date: Tuesday, 19 August 1:18 pm

¿Estoy entendiendo doesRelativeDateFormatting incorrecto?

Hola, cuando modifiqué el código como este. funciona..

  NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = [NSDateFormatter dateFormatFromTemplate:@"EEEE dMMMM',' hma" options:0 locale:[NSLocale currentLocale]]; [formatter setDateStyle:NSDateFormatterFullStyle]; [formatter setTimeStyle:NSDateFormatterShortStyle]; formatter.doesRelativeDateFormatting = YES; NSLog(@"Date: %@", [formatter stringFromDate:[NSDate date]]); 

Parece que doesRelativeDateFormatting no funciona con un dateFormat personalizado.

Tuve el mismo desafío que mostrar Today, 11:44 pm o 19 Aug, 1:23 am La parte difícil es que el año fue siempre excluido.

Lo resolví así:

Obtenga una date formateada con cualquier estilo que desee, con doesRelativeDateFormatting habilitado.

 let dateFormatter = NSDateFormatter() dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle dateFormatter.doesRelativeDateFormatting = true var dateString = dateFormatter.stringFromDate(dateToFormat) 

Obtenga el año formateado a partir de la misma date (asegúrese de que dateFormat tenga el número correcto de y's para representar el año. Utilizo 4 y's porque el estilo de date Medium usa el formatting de año completo.

 let yearFormatter = NSDateFormatter() yearFormatter.dateFormat = NSDateFormatter.dateFormatFromTemplate("yyyy", options: 0, locale: NSLocale.currentLocale()) let yearString = dateFormatter.stringFromDate(dateToFormat) 

Finalmente, componga la secuencia final eliminando el año de la date de generación dateString y recortando un exceso de espacio en blanco.

 var finalString = dateString.stringByReplacingOccurrencesOfString(yearString, withString: "") finalString = finalString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) 

No es una solución ideal porque estoy seguro de que habrá una configuration regional donde el año se formatee justo entre el día y el mes o algo así, lo que crearía una cadena de aspecto funky. Pero funciona en todos mis casos probados.