我想要三个字母格式的月份,但 MMM 在 iOS UIDatePicker 的开头返回带有 "M" 的月份编号

I want month in three alphabet format but MMM is returning month number with "M" at beginning in iOS UIDatePicker

这是我的方法,在选择 UIDatePicker 时间时执行:

-(void) datePickerAction: (UIDatePicker *)sender {
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setLocale:[NSLocale systemLocale]];
    [dateFormatter setDateFormat:@"EEE MMM dd HH:mm:ss zzzz yyyy"];
    self.dateTextView.text = [dateFormatter stringFromDate:self.datePicker.date];
}

这给我日期 Tue M09 29 10:26:29 GMT+05:30 2015

我希望我的月份以三个字母格式显示,例如 OCT 或 JAN。 令人惊讶的是,如果我注释行 [dateFormatter setLocale:[NSLocale systemLocale]]; 那么我会以正确的方式获得月份,因为 Tue Sep 29 10:26:29 Indian Standard Time 2015 具有相同的日期格式化程序。请告诉我哪里错了。

我想要的日期格式示例是 Tue Sep 29 10:26:29 GMT+05:30 2015

MMM 不格式化 3 个字母的缩写。你得到一个缩写,但它是什么取决于语言环境。官方 Unicode 文档有一个带有 4(!) 个字母缩写 ("Sept") 的示例:

http://unicode.org/reports/tr35/tr35-6.html#Date%5FFormat%5FPatterns

因此,您获得的内容取决于语言环境。由于 +systemLocale 交付 "no locale",...

Use the system locale when you don’t want any localizations.

…我想 NSDateFormatter 根本不知道在没有语言环境信息的情况下创建月份缩写。即使这是可能的,也没有意义,因为没有语言环境的本地化形式应该是什么?带有印度缩写的斯瓦希里语月份名称?

您可能想使用 +currentLocale,这是设备上的用户设置。

最好创建一个函数,这样您就可以轻松访问和访问您必须访问的内容 return。

例如

-(NSString *)getStringFromMonth:(NSString *)strMonth
{
    NSInteger monthNum = [strMonth integerValue];
    switch (monthNum)
    {
        case 1:
            return @"Jan";
            break;
        case 2:
            return @"Feb";
            break;
        case 3:
            return @"Mar";
            break;
        case 4:
            return @"Apr";
            break;
        case 5:
            return @"May";
            break;
        case 6:
            return @"Jun";
            break;
        case 7:
            return @"Jul";
            break;
        case 8:
            return @"Aug";
            break;
        case 9:
            return @"Sep";
            break;
        case 10:
            return @"Oct";
            break;
        case 11:
            return @"Nov";
            break;
        case 12:
            return @"Dec";
            break;
        default:
            break;
    }
    return strMonth;
}

阅读 后,我对问题的根本原因一无所知。所以,我实施了一个变通办法,它在我的情况下工作得很好。为了以我想要的格式获取我的日期,我决定使用两个具有不同语言环境的 NSDateFormatter,然后我从两个格式化程序中附加字符串以获得想要的结果。

为了得到三个字母月份中的月份,我制作了一个 NSDateFormatter 对象 并将它的语言环境设置为 [NSLocale currentLocale] 这给了我三个字母格式的月份名称。

为了获得 GMT,我制作了另一个 NSDateFormtter 对象并将其区域设置为 [NSLocale systemLocale],这给了我 GMT 格式。

在此之后,我附加了两个字符串并得到了想要的结果。完整的修改代码如下:

-(void) datePickerAction: (UIDatePicker *)sender {
    [self.datePicker setLocale:[NSLocale currentLocale]];

    NSDateFormatter *dayMonthDate = [NSDateFormatter new];
    [dayMonthDate setLocale:[NSLocale currentLocale]];
    [dayMonthDate setDateFormat:@"EEE MMM dd HH:mm:ss"];

    NSDateFormatter *gmtAndYearFormatter = [NSDateFormatter new];
    [gmtAndYearFormatter setLocale:[NSLocale systemLocale]];
    [gmtAndYearFormatter setDateFormat:@"zzzz yyyy"];

    self.dateTextView.text = [NSString stringWithFormat:@"%@ %@",
                              [dayMonthDate stringFromDate:self.datePicker.date],
                              [gmtAndYearFormatter stringFromDate:self.datePicker.date]];
}

所以,我得到的结果是 Tue Sep 29 11:58:29 GMT+05:30 2015