iOS: como obter um nome de mês adequado a partir de um número?

86

Eu sei que o conjunto de funcionalidades do NSDateformatter é uma benção para a humanidade, mas ao mesmo tempo é muito confuso para mim. Eu espero que você possa me ajudar.

Em algum lugar no meu código, há um int que representa um mês. Portanto: 1 seria janeiro, 2 de fevereiro, etc.

Na minha interface de usuário, gostaria de exibir esse número inteiro como o nome do mês adequado. Além disso, deve estar de acordo com a localidade do dispositivo.

Obrigado por seus insights

Nesse ínterim, fiz o seguinte:

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];

é assim que se faz? Parece um pouco prolixo.

Sjakelien
fonte
1
você poderia substituir MMMM por LLLL
Peter Stajger

Respostas:

162

Outra opção é usar o método monthSymbols:

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

Observe que você precisará subtrair 1 de 1..12 monthNumber, pois monthSymbols é baseado em zero.


fonte
2
Documentação para monthSymbols: developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
firecall
14
Na verdade, isso funciona apenas com o idioma inglês (e idiomas semelhantes). Não funciona com localidades para idiomas que usam casos, por exemplo, idiomas eslavos. standaloneMonthSymbolsdeve ser usado.
Sulthan,
5
Simplificação:NSString *monthName = [[[NSDateFormatter alloc] init] monthSymbols][monthNumber-1];
Johannes Fahrenkrug
7
Por favor, use standaloneMonthSymbols
Roman Truba
1
Use [df shortMonthSymbols]se quiser nomes curtos para os meses (janeiro, fevereiro ...).
Shobhit C
36

Swift 2.0

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

Swift 4.0

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

Você pode alterar o dateFormat do NSDateFormatter. Então, para simplificar seu 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];

Você também deve definir o local depois de inicializar o formatador de data.

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

Espero que isto ajude

Carl
fonte
13

A melhor solução para isso é, standaloneMonthSymbolsmétodo,

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

    NSArray *monthNames = [formate standaloneMonthSymbols];

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

    return monthName;
}
Nico
fonte
10

E se:

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
fonte
8

Ambas as respostas de Anna Karenina e Carl não funcionam muito bem, pois não retornarão o nome do mês no nominativ para algumas culturas. Sugiro usar a solução proposta de Pascal, que resolve esse problema (substituindo monthSymbolspor standaloneMonthSymbols)

sérvio
fonte
6

Em 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
fonte
2
Melhor usar standaloneMonthSymbolspara maiúsculas e minúsculas em alguns idiomas
Gleb Tarasov
6

Swift 4.X

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

Por exemplo:

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

Resultado

novembro

Ashu
fonte
3

NSDate para NSString -> As Dateformat Ex: 2015/06/24

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

NSDate para NSString -> As Dateformat Ex: 24 de junho de 2015, 13h02

        [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
fonte
1

E com 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
fonte
0

Você deve conseguir se livrar da liberação e realocação do dateFormatter, cortando algumas linhas, mas é tudo o que vejo.

Matthew Frederick
fonte