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.


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.



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]

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


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

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

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


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


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

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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.