iOS: Jak uzyskać prawidłową nazwę miesiąca z numeru?

86

Wiem, że zestaw funkcjonalności NSDateformatter jest dobrodziejstwem dla ludzkości, ale jednocześnie jest dla mnie bardzo zagmatwany. Mam nadzieję, że możesz mi pomóc.

Gdzieś w moim kodzie jest int reprezentujący miesiąc. A więc: 1 to styczeń, 2 luty itd.

W moim interfejsie użytkownika chciałbym wyświetlić tę liczbę całkowitą jako właściwą nazwę miesiąca. Ponadto powinien być zgodny z lokalizacją urządzenia.

Dziękuję za spostrzeżenia

W międzyczasie wykonałem następujące czynności:

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

czy to jest sposób na zrobienie tego? Wydaje się to trochę rozwlekłe.

Sjakelien
źródło
1
możesz zamienić MMMM na LLLL
Peter Stajger

Odpowiedzi:

162

Inną opcją jest użycie metody monthSymbols:

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

Pamiętaj, że musisz odjąć 1 od 1..12 MonthNumber od momentu, gdy MonthSymbols jest liczony od zera.


źródło
2
Dokumentacja z miesiąca Symbole: developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
ogniowe
14
W rzeczywistości działa to tylko z językiem angielskim (i podobnymi językami). Nie działa z ustawieniami narodowymi dla języków używających przypadków, np. Języków słowiańskich. standaloneMonthSymbolsmusi być użyte.
Sulthan
5
Uproszczenie:NSString *monthName = [[[NSDateFormatter alloc] init] monthSymbols][monthNumber-1];
Johannes Fahrenkrug
7
Proszę, użyj samodzielnegoMonthSymbols
Roman Truba
1
Użyj, [df shortMonthSymbols]jeśli chcesz mieć krótkie nazwy miesięcy (styczeń, luty ...).
Shobhit C
36

Swift 2.0

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

Swift 4.0

let monthName = DateFormatter().monthSymbols[monthNumber - 1]
pytający
źródło
24

Możesz zmienić dateFormat w NSDateFormatter. Aby uprościć kod:

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

Należy również ustawić ustawienia regionalne po uruchomieniu programu formatującego datę.

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

Mam nadzieję że to pomoże

Carl
źródło
13

Najlepszym rozwiązaniem jest standaloneMonthSymbolsmetoda,

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

    NSArray *monthNames = [formate standaloneMonthSymbols];

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

    return monthName;
}
Nico
źródło
10

Co powiesz na:

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
źródło
8

Obie odpowiedzi od Anny Kareniny i Carla nie działają tak dobrze, ponieważ w niektórych kulturach nie podadzą nazwy miesiąca. Proponuję skorzystać z zaproponowanego rozwiązania z Pascala, który rozwiązuje ten problem (zastępując monthSymbolsz standaloneMonthSymbols)

Serb
źródło
6

W 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
źródło
2
Lepiej używać standaloneMonthSymbolsdo poprawnych przypadków w niektórych językach
Gleb Tarasov
6

Swift 4.X

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

Na przykład:

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

Wynik

listopad

Ashu
źródło
3

NSDate to 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 to NSString -> As Dateformat Ex: 2015 24 czerwca, 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);
PradeepKN
źródło
1

A z 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
źródło
0

Powinieneś być w stanie pozbyć się wydania i ponownego przydzielenia dateFormatter, wycinając kilka linii, ale to wszystko, co widzę.

Matthew Frederick
źródło