NSDateFormatter: date según currentLocale, sin año

Esto no puede ser muy difícil …

Quiero mostrar una date sin el año. Por ejemplo: "Ago, 2do" (EE. UU.) O "02.08". (ALEMANIA) También debe funcionar para muchos otros locales.

Mi única idea hasta el momento es hacer un formatting normal con año, y luego eliminar la parte del año de la cadena generada.

Creo que necesitas echar un vistazo a:

+ (NSString *)dateFormatFromTemplate:(NSString *)template options:(NSUInteger)opts locale:(NSLocale *)locale 

Según los documentos:

Devuelve una cadena de formatting de date localizada que representa los componentes de formatting de date dados organizados adecuadamente para la configuration regional especificada. Valor devuelto Una cadena de formatting de date localizada que representa los componentes de formatting de date dados en la plantilla, organizados adecuadamente para la configuration regional especificada por la configuration regional.

La cadena devuelta puede no contener exactamente los componentes dados en la plantilla, pero puede, por ejemplo, tener ajustes específicos de la localidad aplicados.

Discusión

Diferentes locales tienen convenciones diferentes para el pedido de componentes de date. Utiliza este método para get una cadena de formatting adecuada para un set determinado de componentes para un entorno local especificado (normalmente usa el entorno local actual, consulte currentLocale).

El siguiente ejemplo muestra la diferencia entre los formattings de date para inglés británico y americano:

 NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; NSLocale *gbLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]; NSString *dateFormat; // NOTE!!! I removed the 'y' from the example NSString *dateComponents = @"MMMMd"; //@"yMMMMd"; dateFormat = [NSDateFormatter dateFormatFromTemplate:dateComponents options:0 locale:usLocale]; NSLog(@"Date format for %@: %@", [usLocale displayNameForKey:NSLocaleIdentifier value:[usLocale localeIdentifier]], dateFormat); dateFormat = [NSDateFormatter dateFormatFromTemplate:dateComponents options:0 locale:gbLocale]; NSLog(@"Date format for %@: %@", [gbLocale displayNameForKey:NSLocaleIdentifier value:[gbLocale localeIdentifier]], dateFormat); // Output: // Date format for English (United States): MMMM d, y // Date format for English (United Kingdom): d MMMM y 

Código adicional (agregue esto al código anterior):

 // NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; formatter.locale = gbLocale; formatter.dateFormat = dateFormat; NSLog(@"date: %@", [formatter stringFromDate: [NSDate date]]); 

Vea aquí: NSDateFormatter Class Reference

Los dos ejemplos que das son muy diferentes entre sí. Uno usa el nombre abreviado del mes mientras que el otro usa el número de mes de 2 dígitos. Uno utiliza un ordinal de día ("segundo") mientras que el otro simplemente usa el número de día de 2 dígitos.

Si puede aceptar usar el mismo formatting general para todos los locales, entonces use NSDateFormatter dateFormatFromTemplate:options:locale:

 NSString *localFormat = [NSDateFormatter dateFormatFromTemplate:@"MMM dd" options:0 locale:[NSLocale currentLocale]]; 

El resultado de esta llamada devolverá una cadena de formatting que puede utilizar con NSDateFormatter setDateFormat: El order del mes y el día será apropiado para la configuration regional, así como cualquier puntuación adicional que deba agregarse.

Pero, una vez más, esto no resolverá sus necesidades exactas debido a los formattings completamente diferentes que parece querer para cada localidad.

Swift 3

 let template = "EEEEdMMM" let locale = NSLocale.current // the device current locale let format = DateFormatter.dateFormat(fromTemplate: template, options: 0, locale: locale) let formatter = DateFormatter() formatter.dateFormat = format let now = Date() let whatYouWant = formatter.string(from: now) // Sunday, Mar 5 

Juega con la template para que coincida con tus necesidades.

Doc y ejemplos aquí para ayudarlo a determinar la plantilla que desea.