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


86

我知道NSDateformatter功能套件对人类来说是一个福音,但与此同时,这也让我感到困惑。我希望你能帮助我。

在我的代码中的某个地方,有一个int代表一个月。因此:1是1月,2月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];

这是这样做的方法吗?似乎有点罗word。


1
您可以用LLLL代替MMMM
Peter Stajger 2014年

Answers:


162

另一种选择是使用monthSymbols方法:

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

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



14
实际上,这仅适用于英语语言环境(和类似语言)。对于使用案例的语言,例如斯拉夫语言,它不适用于语言环境。standaloneMonthSymbols必须使用。
苏珊(Sulthan)2013年

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

7
请使用standaloneMonthSymbols
Roman Truba 2014年

1
使用[df shortMonthSymbols],如果你想短月份名(一月,二月...)。
Shobhit C,

36

斯威夫特2.0

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

迅捷4.0

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

8

安娜·卡列尼娜(Anna Karenina)和卡尔(Carl)的两个答案都效果不佳,因为对于某些文化,他们不会在nominativ中返回月份名称。我建议使用Pascal提出的解决方案,以解决此问题(替换monthSymbolsstandaloneMonthSymbols


6

在Swift 3.0中

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

    // result
   "March\n"        

2
最好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- > As Dateformat例如: 2015/06/24

        NSDateFormatter *dateformate=[[NSDateFormatter alloc]init];
        [dateformate setDateFormat: @"yyyy/MM/dd"];
        NSString *date = [dateformate stringFromDate:selectedDate]; // Convert date to string

NSDate转换为NSString- > As Dateformat Ex: 2015 June 24,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);

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.