iOS: Wie erhalte ich einen richtigen Monatsnamen aus einer Zahl?

86

Ich weiß, dass die NSDateformatter-Funktionssuite ein Segen für die Menschheit ist, aber gleichzeitig ist sie für mich sehr verwirrend. Ich hoffe du kannst mir helfen.

Irgendwo in meinem Code gibt es ein int, das einen Monat darstellt. Also: 1 wäre Januar, 2. Februar usw.

In meiner Benutzeroberfläche möchte ich diese Ganzzahl als richtigen Monatsnamen anzeigen. Darüber hinaus sollte es dem Gebietsschema des Geräts entsprechen.

Vielen Dank für Ihre Erkenntnisse

In der Zwischenzeit habe ich Folgendes getan:

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

ist das der Weg, es zu tun? Es scheint ein bisschen wortreich.

Sjakelien
quelle
1
Sie könnten MMMM durch LLLL ersetzen
Peter Stajger

Antworten:

161

Eine andere Option ist die Verwendung der monthSymbols-Methode:

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

Beachten Sie, dass Sie 1 von Ihrer 1..12 monthNumber subtrahieren müssen, da monthSymbols auf Null basiert.


quelle
2
Dokumentation für monthSymbols: developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
Feuerruf
14
Dies funktioniert tatsächlich nur mit dem englischen Gebietsschema (und ähnlichen Sprachen). Es funktioniert nicht mit Gebietsschemas für Sprachen, die Fälle verwenden, z. B. slawische Sprachen. standaloneMonthSymbolsmuss benutzt werden.
Sulthan
5
Vereinfachung:NSString *monthName = [[[NSDateFormatter alloc] init] monthSymbols][monthNumber-1];
Johannes Fahrenkrug
7
Bitte verwenden Sie StandaloneMonthSymbols
Roman Truba
1
Verwenden [df shortMonthSymbols]Sie diese Option, wenn Sie kurze Monatsnamen möchten (Jan, Feb ...).
Shobhit C
36

Swift 2.0

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

Swift 4.0

let monthName = DateFormatter().monthSymbols[monthNumber - 1]
sehr schön
quelle
24

Sie können das dateFormat des NSDateFormatter ändern. So vereinfachen Sie Ihren Code:

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

Sie sollten das Gebietsschema auch festlegen, sobald Sie den Datumsformatierer gestartet haben.

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

Hoffe das hilft

Carl
quelle
13

Die beste Lösung hierfür ist, standaloneMonthSymbolsMethode,

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

    NSArray *monthNames = [formate standaloneMonthSymbols];

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

    return monthName;
}
Nico
quelle
10

Wie wäre es mit:

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

Beide Antworten von Anna Karenina und Carl funktionieren nicht so gut, da sie für einige Kulturen keinen nominativen Monatsnamen zurückgeben. Ich schlage vor, die vorgeschlagene Lösung von Pascal zu verwenden, die dieses Problem löst (durch Ersetzen monthSymbolsdurch standaloneMonthSymbols).

serb
quelle
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"        
Heshan Sandeepa
quelle
2
Besser standaloneMonthSymbolsfür korrekte Groß- und Kleinschreibung in einigen Sprachen zu verwenden
Gleb Tarasov
6

Swift 4.X.

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

Beispielsweise:

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

Ausgabe

November

Ashu
quelle
3

NSDate to NSString -> As Dateformat Ex: 24.06.2015

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

NSDate to NSString -> As Dateformat Ex: 2015 24. Juni, 13:02 Uhr

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

Und mit 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
quelle
0

Sie sollten in der Lage sein, die Veröffentlichung und Neuzuweisung von dateFormatter loszuwerden und ein paar Zeilen auszuschneiden, aber das ist alles, was ich sehe.

Matthew Frederick
quelle