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.


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.



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]

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


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

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

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)


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"        

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


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

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

0

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.