2010-12-20 15 views
71

Sé que el conjunto de funciones de NSDateformatter es una bendición para la humanidad, pero al mismo tiempo me resulta muy confuso. Espero que me puedas ayudar.iOS: ¿Cómo obtener un nombre de mes correcto de un número?

En algún lugar de mi código, hay un int que representa un mes. Entonces: 1 sería enero, 2 de febrero, etc.

En mi interfaz de usuario, me gustaría mostrar este entero como el nombre correcto del mes. Además, debe cumplir con la configuración regional del dispositivo.

Gracias por sus ideas

Por el momento, he hecho lo siguiente:

int monthNumber = 11 
NSString * dateString = [NSString stringWithFormat: @"%d", monthNumber]; 

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MM"]; 
NSDate* myDate = [dateFormatter dateFromString:dateString]; 
[dateFormatter release]; 

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"MMMM"]; 
NSString *stringFromDate = [formatter stringFromDate:myDate]; 
[formatter release]; 

es esta la manera de hacerlo? Parece un poco prolijo.

+1

podría reemplazar MMMM con LLLL –

Respuesta

144

Otra opción es utilizar el método monthSymbols:

int monthNumber = 11; //November 
NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease]; 
NSString *monthName = [[df monthSymbols] objectAtIndex:(monthNumber-1)]; 

Tenga en cuenta que tendrá que restar 1 a su 1..12 MonthNumber desde monthSymbols está basado en cero.

+0

Gracias! Si bien las otras respuestas también son muy útiles, ¡esta se adapta mejor a mi situación! – Sjakelien

+2

Documentación para monthSymbols: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html – firecall

+11

Esto realmente solo funciona con la configuración regional en inglés (e idiomas similares) No funciona con las configuraciones regionales para los idiomas que usan casos, p. Ej. Idiomas eslavos. 'standaloneMonthSymbols' debe ser utilizado. – Sulthan

0

Debería poder deshacerse del lanzamiento y la reasignación de dateFormatter, cortando un par de líneas, pero eso es todo lo que veo.

24

Puede cambiar el formato de fecha de NSDateFormatter. Para simplificar su código:

int monthNumber = 11 
NSString * dateString = [NSString stringWithFormat: @"%d", monthNumber]; 

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MM"]; 
NSDate* myDate = [dateFormatter dateFromString:dateString]; 

[formatter setDateFormat:@"MMMM"]; 
NSString *stringFromDate = [formatter stringFromDate:myDate]; 
[dateFormatter release]; 

También debe establecer la configuración regional una vez que inicie el formateador de fecha.

dateFormatter.locale = [NSLocale currentLocale]; // Or any other locale 

Esperanza esto ayuda

8

Cómo sobre: ​​

NSUInteger i = <your month integer>; 
NSDateFormatter *df = [NSDateFormatter new]; 
// change locale if the standard is not what you want 
NSArray *monthNames = [df standaloneMonthSymbols]; 
NSString *monthName = [monthNames objectAtIndex:(i - 1)]; 
[df release]; 
8

Ambas respuestas de Ana Karenina y Carl no funciona tan bien, ya que no volverán nombre del mes en Nominativ para algunas culturas . Es mejor utilizar la solución propuesta de Pascal, que resuelve este problema (reemplazando monthSymbols con standaloneMonthSymbols)

11

mejor solución para esto es, standaloneMonthSymbols método,

-(NSString*)MonthNameString:(int)monthNumber 
{ 
    NSDateFormatter *formate = [NSDateFormatter new]; 

    NSArray *monthNames = [formate standaloneMonthSymbols]; 

    NSString *monthName = [monthNames objectAtIndex:(monthNumber - 1)]; 

    return monthName; 
} 
1

Y con ARC:

+ (NSString *)monthNameFromDate:(NSDate *)date { 
    if (!date) return @"n/a"; 
    NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
    [df setDateFormat:@"MM"]; 
    return [[df monthSymbols] objectAtIndex:([[df stringFromDate:date] integerValue] - 1)]; 
} 
3

NSFecha a NSString-> Como Dateformat Ej .:2015/06/24

 NSDateFormatter *dateformate=[[NSDateFormatter alloc]init]; 
     [dateformate setDateFormat: @"yyyy/MM/dd"]; 
     NSString *date = [dateformate stringFromDate:selectedDate]; // Convert date to string 

NSDate a NSString-> Como Dateformat Ex:2015 24 de junio de 13:02

 [dateformate setDateFormat:@"yyyy MMMM dd, h:mm a"]; 
     NSString *displayDate = [dateformate stringFromDate:selectedDate]; // Convert date to string 
     NSLog(@"date :%@",date); 
     NSLog(@"Display time = %@", displayDate); 
14

Swift 2.0

let monthName = NSDateFormatter().monthSymbols[monthNumber - 1] 
2

En Swift 3,0

let monthNumber = 3 
    let fmt = DateFormatter() 
    fmt.dateFormat = "MM" 
    let month = fmt.monthSymbols[monthNumber - 1] 
    print(month) 

    // result 
    "March\n"   
Cuestiones relacionadas