iOS: จะตั้งชื่อเดือนจากตัวเลขได้อย่างไร?


86

ฉันรู้ว่าชุดฟังก์ชัน NSDateformatter เป็นประโยชน์สำหรับมนุษยชาติ แต่ในขณะเดียวกันก็ทำให้ฉันสับสนมาก ฉันหวังว่าคุณจะช่วยฉันได้

ที่ไหนสักแห่งในรหัสของฉันมี int แทนเดือน ดังนั้น: 1 จะเป็นมกราคม 2 กุมภาพันธ์เป็นต้น

ในอินเทอร์เฟซผู้ใช้ของฉันฉันต้องการแสดงจำนวนเต็มนี้เป็นชื่อเดือนที่ถูกต้อง ยิ่งไปกว่านั้นควรเป็นไปตามที่ตั้งของอุปกรณ์

ขอบคุณสำหรับข้อมูลเชิงลึก

ในระหว่างนั้นฉันได้ทำสิ่งต่อไปนี้:

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

นี่คือวิธีที่จะทำหรือไม่ ดูเหมือนว่าจะพูดมากไปหน่อย


1
คุณสามารถแทนที่ MMMM ด้วย LLLL
Peter Stajger

คำตอบ:


162

อีกทางเลือกหนึ่งคือใช้เมธอด monthSymbols:

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

โปรดทราบว่าคุณจะต้องลบ 1 ออกจาก 1..12 monthNumber ของคุณเนื่องจาก monthSymbols เป็นศูนย์


2
เอกสารประกอบสำหรับ monthSymbols: developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
firecall

14
สิ่งนี้ใช้ได้กับภาษาอังกฤษเท่านั้น (และภาษาที่คล้ายกัน) ใช้ไม่ได้กับภาษาสำหรับภาษาที่ใช้กรณีเช่นภาษาสลาฟ standaloneMonthSymbolsต้องใช้
Sulthan

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

7
โปรดใช้แบบสแตนด์อโลน
MonthSymbols

1
ใช้[df shortMonthSymbols]ถ้าคุณต้องการชื่อเดือนแบบสั้น (ม.ค. , ก.พ. ... )
Shobhit C


24

คุณสามารถเปลี่ยน dateFormat ของ NSDateFormatter ดังนั้นเพื่อให้รหัสของคุณง่ายขึ้น:

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

คุณควรตั้งค่าภาษาเมื่อคุณเริ่มต้นตัวจัดรูปแบบวันที่

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

หวังว่านี่จะช่วยได้


13

ทางออกที่ดีที่สุดคือstandaloneMonthSymbolsวิธีการ

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

    NSArray *monthNames = [formate standaloneMonthSymbols];

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

    return monthName;
}

10

เกี่ยวกับ:

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

ทั้งสองคำตอบจาก Anna Karenina และ Carl ใช้ไม่ได้ผลเช่นกันเนื่องจากพวกเขาจะไม่คืนชื่อเดือนในนามของบางวัฒนธรรม ฉันขอแนะนำให้ใช้โซลูชันที่เสนอจาก Pascal ซึ่งช่วยแก้ปัญหานี้ได้ (โดยแทนที่monthSymbolsด้วยstandaloneMonthSymbols)


7

ใน Swift 3.0

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

    // result
   "March\n"        

3
ควรใช้standaloneMonthSymbolsสำหรับกรณีที่ถูกต้องในบางภาษา
Gleb Tarasov

6

สวิฟต์ 4.X

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

ตัวอย่างเช่น:

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

เอาต์พุต

พฤศจิกายน


3

NSDate เป็น NSString -> เป็นรูปแบบวันที่เช่น 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 มิถุนายน 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

และด้วย 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

คุณควรจะสามารถกำจัดรีลีสและการจัดสรร dateFormatter ใหม่ได้โดยตัดสองสามบรรทัดออก แต่นั่นคือทั้งหมดที่ฉันเห็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.