iOS: come ottenere il nome del mese corretto da un numero?


86

So che la suite di funzionalità NSDateformatter è un vantaggio per l'umanità, ma allo stesso tempo è molto confusa per me. Spero che tu possa aiutarmi.

Da qualche parte nel mio codice, c'è un int che rappresenta un mese. Quindi: 1 sarebbe gennaio, 2 febbraio, ecc.

Nella mia interfaccia utente, vorrei visualizzare questo numero intero come nome del mese corretto. Inoltre, dovrebbe aderire alle impostazioni locali del dispositivo.

Grazie per le tue intuizioni

Nel frattempo, ho fatto quanto segue:

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

è questo il modo per farlo? Sembra un po 'prolisso.


1
potresti sostituire MMMM con LLLL
Peter Stajger

Risposte:


162

Un'altra opzione è usare il metodo monthSymbols:

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

Nota che dovrai sottrarre 1 da 1..12 monthNumber poiché monthSymbols è a base zero.



14
In realtà funziona solo con la lingua inglese (e lingue simili). Non funziona con le impostazioni locali per le lingue che utilizzano i casi, ad esempio le lingue slave. standaloneMonthSymbolsdeve essere usato.
Sulthan

5
Semplificazione:NSString *monthName = [[[NSDateFormatter alloc] init] monthSymbols][monthNumber-1];
Johannes Fahrenkrug

7
Si prega di utilizzare standaloneMonthSymbols
Roman Truba

1
Utilizzare [df shortMonthSymbols]se si desidera nomi di mesi brevi (gennaio, febbraio ...).
Shobhit C

36

Swift 2.0

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

Swift 4.0

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

24

È possibile modificare dateFormat di NSDateFormatter. Quindi, per semplificare il tuo codice:

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

Dovresti anche impostare le impostazioni locali dopo aver avviato il formattatore della data.

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

Spero che sia di aiuto


13

La migliore soluzione per questo è, standaloneMonthSymbolsmetodo,

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

    NSArray *monthNames = [formate standaloneMonthSymbols];

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

    return monthName;
}

10

Che ne dite di:

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

Entrambe le risposte di Anna Karenina e Carl non funzionano così bene in quanto non restituiranno il nome del mese in nominativo per alcune culture. Suggerisco di utilizzare la soluzione proposta da Pascal, che risolve questo problema (sostituendo monthSymbolscon standaloneMonthSymbols)


6

In Swift 3.0

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

    // result
   "March\n"        

2
Meglio usare standaloneMonthSymbolsper il caso corretto in alcune lingue
Gleb Tarasov

6

Swift 4.X

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

Per esempio:

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

Produzione

novembre


3

NSDate a NSString -> Come 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 a NSString -> Come formato data Ex: 24 giugno 2015, 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);

1

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

0

Dovresti essere in grado di sbarazzarti del rilascio e della riassegnazione di dateFormatter, tagliando un paio di righe, ma è tutto quello che vedo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.