iOS: ¿Cómo obtener un nombre de mes adecuado a partir de un número?

86

Sé que el conjunto de funciones NSDateformatter es una bendición para la humanidad, pero al mismo tiempo es muy confuso para mí. Espero que me puedas ayudar.

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 número entero como el nombre del mes adecuado. Además, debe adherirse a la ubicación del dispositivo.

Gracias por sus conocimientos

Mientras tanto, 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.

Sjakelien
fuente
1
podría reemplazar MMMM con LLLL
Peter Stajger

Respuestas:

162

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 deberá restar 1 de su número 1..12 monthNumber ya que monthSymbols tiene una base cero.


fuente
2
Documentación para monthSymbols: developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
firecall
14
En realidad, esto solo funciona con la configuración regional en inglés (e idiomas similares). No funciona con configuraciones regionales para idiomas que usan casos, por ejemplo, idiomas eslavos. standaloneMonthSymbolsdebe ser usado.
Sulthan
5
Simplificación:NSString *monthName = [[[NSDateFormatter alloc] init] monthSymbols][monthNumber-1];
Johannes Fahrenkrug
7
Por favor, use standaloneMonthSymbols
Roman Truba
1
Úselo [df shortMonthSymbols]si desea nombres de meses cortos (enero, febrero ...).
Shobhit C
36

Swift 2.0

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

Swift 4.0

let monthName = DateFormatter().monthSymbols[monthNumber - 1]
quemeful
fuente
24

Puede cambiar el formato de fecha de NSDateFormatter. Entonces, 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

Espero que esto ayude

Carl
fuente
13

La mejor solución para esto es, standaloneMonthSymbolsmétodo,

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

    NSArray *monthNames = [formate standaloneMonthSymbols];

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

    return monthName;
}
Nico
fuente
10

Qué tal si:

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];
Pascal
fuente
8

Ambas respuestas de Anna Karenina y Carl no funcionan tan bien, ya que no devolverán el nombre del mes en nominativo para algunas culturas. Sugiero usar la solución propuesta de Pascal, que resuelve este problema (reemplazando monthSymbolscon standaloneMonthSymbols)

serbio
fuente
6

En Swift 3.0

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

    // result
   "March\n"        
Heshan Sandeepa
fuente
2
Es mejor usar standaloneMonthSymbolsel caso correcto en algunos idiomas
Gleb Tarasov
6

Swift 4.X

print((DateFormatter().monthSymbols[month-1].capitalized)) //month is int less than 12

Por ejemplo:

print((DateFormatter().monthSymbols[11-1].capitalized))

Salida

noviembre

Ashu
fuente
3

NSDate a NSString -> Como formato de fecha 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 formato de fecha Ej .: 24 de junio de 2015, 1:02 p.m.

        [dateformate setDateFormat:@"yyyy MMMM dd, h:mm a"];
        NSString *displayDate = [dateformate stringFromDate:selectedDate]; // Convert date to string
        NSLog(@"date :%@",date);
        NSLog(@"Display time = %@", displayDate);
PradeepKN
fuente
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)];
}
Kevin Delord
fuente
0

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

Matthew Frederick
fuente