iOS:如何从数字获取正确的月份名称?

91

我知道NSDateFormatter功能套件对人类来说是一大福音,但同时它也让我很困惑。希望你可以帮忙解决。

在我的代码中,有一个表示月份的整数。比如: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
你可以用LLLL替换MMMM - Tankista
11个回答

166

另一个选项是使用monthSymbols方法:

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

请注意,由于monthSymbols是从零开始的,因此您需要从1..12的monthNumber中减去1。

2
monthSymbols 的文档:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html - firecall
15
这实际上只适用于英语环境(以及类似的语言),对于使用格例的语言环境,例如斯拉夫语言,它是无效的。必须使用“standaloneMonthSymbols”。 - Sulthan
5
简化版:NSString *monthName = [[NSDateFormatter new] monthSymbols][monthNumber-1]; - Johannes Fahrenkrug
7
请使用standaloneMonthSymbols。 - Roman Truba
1
如果您想要使用短月份名称(Jan,Feb等),请使用 [df shortMonthSymbols] - Shobhit C
显示剩余5条评论

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

24

您可以更改NSDateFormatter的dateFormat。因此,为了简化您的代码:

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

9
安娜·卡列尼娜和卡尔的回答并不适用于所有文化,因为它们不能以主格形式返回月份名称。我建议使用帕斯卡尔提出的解决方案,该解决方案通过将monthSymbols替换为standaloneMonthSymbols来解决这个问题。

8

在Swift 3.0中

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

    // result
   "March\n"        

4
在一些语言中,为了正确处理大小写,最好使用standaloneMonthSymbols - Gleb Tarasov

6

Swift 4.X

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

例如:

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

输出结果

November


4

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转NSString -> 日期格式如下: 2015年6月24日 下午1点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)];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接