NSDateFormatter:根据currentLocale的日期,没有Year

时间:2013-09-12 14:41:17

标签: ios objective-c nsdateformatter

这不可能太难......

我想显示没有年份的日期。例如:“Aug,2nd”(美国)或“02.08”。 (德国) 它也必须适用于许多其他语言环境。

到目前为止,我唯一的想法是使用年份执行普通格式,然后从生成的字符串中删除年份部分。

4 个答案:

答案 0 :(得分:22)

我想你需要看看:

+ (NSString *)dateFormatFromTemplate:(NSString *)template options:(NSUInteger)opts locale:(NSLocale *)locale

根据文档:

  

返回一个本地化的日期格式字符串,表示为指定的语言环境正确排列的给定日期格式组件。   回报价值   一个本地化的日期格式字符串,表示模板中给出的日期格式组件,适合为locale指定的区域设置。

     

返回的字符串可能不完全包含模板中给出的那些组件,但可能 - 例如 - 应用了特定于语言环境的调整。

     

讨论

     

不同的语言环境对日期组件的排序有不同的约定。您可以使用此方法为指定区域设置的给定组件集获取适当的格式字符串(通常使用当前区域设置 - 请参阅currentLocale)。

     

以下示例显示英国和美国英语的日期格式之间的差异:

NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
NSLocale *gbLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];

NSString *dateFormat;
// NOTE!!! I removed the 'y' from the example
NSString *dateComponents = @"MMMMd";  //@"yMMMMd";

dateFormat = [NSDateFormatter dateFormatFromTemplate:dateComponents options:0 locale:usLocale];
NSLog(@"Date format for %@: %@",
[usLocale displayNameForKey:NSLocaleIdentifier value:[usLocale localeIdentifier]], dateFormat);

dateFormat = [NSDateFormatter dateFormatFromTemplate:dateComponents options:0 locale:gbLocale];
NSLog(@"Date format for %@: %@",
[gbLocale displayNameForKey:NSLocaleIdentifier value:[gbLocale localeIdentifier]], dateFormat);

// Output:
// Date format for English (United States): MMMM d, y
// Date format for English (United Kingdom): d MMMM y

额外代码(将其添加到上面的代码中):

// 
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
formatter.locale = gbLocale;
formatter.dateFormat = dateFormat;
NSLog(@"date: %@", [formatter stringFromDate: [NSDate date]]);

见这里: NSDateFormatter Class Reference

答案 1 :(得分:19)

你给出的两个例子彼此非常不同。一个使用缩写的月份名称,而另一个使用2位数的月份号码。一个使用日序(“2nd”),而另一个使用2位数日。

如果您可以接受对所有语言环境使用相同的通用格式,请使用NSDateFormatter dateFormatFromTemplate:options:locale:

NSString *localFormat = [NSDateFormatter dateFormatFromTemplate:@"MMM dd" options:0 locale:[NSLocale currentLocale]];

此调用的结果将返回可与NSDateFormatter setDateFormat:一起使用的格式字符串。月份和日期的顺序适用于区域设置以及应添加的任何其他标点符号。

但同样,这不会解决您的确切需求,因为您希望每种语言环境都有完全不同的格式。

答案 2 :(得分:4)

Swift 3

let template = "EEEEdMMM"
let locale = NSLocale.current // the device current locale

let format = DateFormatter.dateFormat(fromTemplate: template, options: 0, locale: locale)
let formatter = DateFormatter()
formatter.dateFormat = format

let now = Date()
let whatYouWant = formatter.string(from: now) // Sunday, Mar 5

template一起玩,以满足您的需求。

Doc and examples here可帮助您确定所需的模板。

答案 3 :(得分:0)

以上所有答案均使用iOS 4中发布的旧API。iOS8中引入了较新的API。

在苹果documentation for DateFormatter中,它提供了以下示例代码,仅显示日期中的日期和月份。如果您不想指定特定的Locale.current,可以将locale传递给DateFormatter(我无法确定这是否是默认实现,因此建议您始终在使用文档中建议的setLocalizedDateFormatFromTemplate(_:)之前先设置语言环境。

let dateFormatter = DateFormatter()
let date = Date(timeIntervalSinceReferenceDate: 410220000)

// US English Locale (en_US)
dateFormatter.locale = Locale(identifier: "en_US")
dateFormatter.setLocalizedDateFormatFromTemplate("MMMMd") // set template after setting locale
print(dateFormatter.string(from: date)) // December 31

// British English Locale (en_GB)
dateFormatter.locale = Locale(identifier: "en_GB")
dateFormatter.setLocalizedDateFormatFromTemplate("MMMMd") // // set template after setting locale
print(dateFormatter.string(from: date)) // 31 December