18

这个不能太难。。

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

到目前为止,我唯一的想法是用年份做一个正常的格式,然后从生成的字符串中删除年份部分。

4

4 回答 4

26

我认为你需要看看:

+ (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 类参考

于 2013-09-12T14:55:21.280 回答
20

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

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

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

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

但同样,这并不能解决您的确切需求,因为您似乎对每个语言环境都需要完全不同的格式。

于 2013-09-12T14:50:51.287 回答
8

斯威夫特 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满足您的需求。

此处的文档和示例可帮助您确定所需的模板。

于 2017-03-02T17:12:43.707 回答
1

以上所有答案均使用 iOS 4 中发布的较旧 api。iOS 8 中引入的较新 api 可用。

在 DateFormatter 的苹果文档中,它提供了以下示例代码,仅显示日期中的日期和月份。Locale.current如果您不想指定特定locale的,您可以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
于 2020-07-06T07:04:28.513 回答