iOS: Bagaimana cara mendapatkan nama Bulan yang tepat dari sebuah angka?

86

Saya tahu bahwa rangkaian fungsionalitas formatter NSDate adalah anugerah bagi umat manusia, tetapi pada saat yang sama juga sangat membingungkan saya. Saya harap Anda dapat membantu saya.

Di suatu tempat di kode saya, ada int yang mewakili satu bulan. Jadi: 1 Januari, 2 Februari, dll.

Di antarmuka pengguna saya, saya ingin menampilkan integer ini sebagai nama bulan yang sesuai. Selain itu, itu harus mematuhi lokal perangkat.

Terima kasih atas pemaparan anda

Sementara itu, saya telah melakukan hal berikut:

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

apakah ini cara untuk melakukannya? Sepertinya agak bertele-tele.

Sjakelien
sumber
1
Anda dapat mengganti MMMM dengan LLLL
Peter Stajger

Jawaban:

162

Opsi lainnya adalah menggunakan metode monthSymbols:

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

Perhatikan bahwa Anda harus mengurangi 1 dari 1..12 monthNumber karena monthSymbols berbasis nol.


sumber
2
Dokumentasi untuk monthSymbols: developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
firecall
14
Ini sebenarnya hanya berfungsi dengan bahasa Inggris lokal (dan bahasa serupa). Ini tidak bekerja dengan lokal untuk bahasa yang menggunakan kasus, misalnya bahasa Slavia. standaloneMonthSymbolsharus digunakan.
Sulthan
5
Penyederhanaan:NSString *monthName = [[[NSDateFormatter alloc] init] monthSymbols][monthNumber-1];
Johannes Fahrenkrug
7
Silakan, gunakan standaloneMonthSymbols
Roman Truba
1
Gunakan [df shortMonthSymbols]jika Anda ingin nama bulan pendek (Jan, Feb ...).
Shobhit C
36

Swift 2.0

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

Swift 4.0.0

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

Anda dapat mengubah dateFormat dari NSDateFormatter. Jadi untuk menyederhanakan kode Anda:

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

Anda juga harus menyetel lokal setelah Anda memasukkan formatter tanggal.

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

Semoga ini membantu

Carl
sumber
13

Solusi terbaik untuk ini adalah, standaloneMonthSymbolsmetode,

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

    NSArray *monthNames = [formate standaloneMonthSymbols];

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

    return monthName;
}
Nico
sumber
10

Bagaimana tentang:

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

Kedua jawaban dari Anna Karenina dan Carl tidak berfungsi dengan baik karena mereka tidak akan mengembalikan nama bulan dalam nominativ untuk beberapa budaya. Saya menyarankan untuk menggunakan solusi yang diusulkan dari Pascal, yang memecahkan masalah ini (dengan menggantinya monthSymbolsdengan standaloneMonthSymbols)

Serbia
sumber
7

Di 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
sumber
3
Lebih baik digunakan standaloneMonthSymbolsuntuk kasus yang benar dalam beberapa bahasa
Gleb Tarasov
6

Swift 4.X.

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

Sebagai contoh:

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

Keluaran

November

Ashu
sumber
3

NSDate to NSString -> As Dateformat Contoh: 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 Contoh: 2015 24 Juni, 1:02 PM

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

Dan dengan 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
sumber
0

Anda seharusnya bisa menyingkirkan rilis dan alokasi ulang dateFormatter, memotong beberapa baris, tapi hanya itu yang saya lihat.

Matthew Frederick
sumber