12

这是一个有点棘手的问题。我在 iPhone 上使用 NSDateFormatter 但我只想显示没有年份组件的标准日期。但保留用户日期的区域设置格式。

我可以使用轻松覆盖格式

[dateFormatter setDateFormat:@"h:mma EEEE MMMM d"];  // hurl.ws/43p9 (date formatting)

但是现在日期是我的 en-nz 格式,例如 7 月 7 日星期三下午 12:01。所以我已经完全杀死了世界各地任何其他用户的语言环境。

我想说。

给我这个用​​户区域的正确本地化日期,但省略年份部分。

由于日期显示为字符串,我很想从日期开始,然后通过将其从字符串中删除来删除年份组件。

4

3 回答 3

16

从 iOS 4.0 开始,正确的做法(参见 WWDC 2012 的本地化会话)支持开箱即用的不同区域设置变体,使用上面提到的以下 API

+dateFormatFromTemplate:options:locale:

例如,要获得没有年份的长日期格式:

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];  
NSString *longFormatWithoutYear = [NSDateFormatter dateFormatFromTemplate:@"MMMM d" options:0 locale:[NSLocale currentLocale]]; 
[dateFormatter setDateFormat:longFormatWithoutYear];
//format your date... 
//output will change according to locale. E.g. "July 9" in US or "9 de julho" in Portuguese
于 2012-07-08T23:41:04.303 回答
11

您可以尝试以下方法:

//create a date formatter with standard locale, then:

// have to set a date style before dateFormat will give you a string back
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];

// read out the format string
NSString *format = [dateFormatter dateFormat];
format = [format stringByReplacingOccurrencesOfString:@"y" withString:@""];
[dateFormatter setDateFormat:format];

有点黑客,但它应该工作。

编辑:您可能希望首先删除出现的字符串@"y,"@" y"以防您最终得到一些时髦的额外空格或逗号。

于 2009-07-09T04:54:20.387 回答
10

上述答案的问题在于@"y,"@" y"两者都依赖于本地化。我只是尝试将计算机上的日期和时间格式设置为日文、韩文和许多其他格式。您会发现有时年份由当地语言的符号表示,有时使用句点,或其他一些可能性。因此,如果您希望保持正确的本地化依赖性,您还需要搜索和替换所有这些可能性。

有一个类方法+dateFormatFromTemplate:options:locale:可能会有所帮助,尽管它不采用日期或时间样式,因此不够灵活。

我不确定 Apple 的其他 API 是否有一个好的解决方案。但即便如此,也不清楚他们是否将自己的本地化划分为组件。没有这些,这基本上是一项不可能完成的任务。

于 2009-12-14T18:07:33.473 回答