在iPhone上使用NSDateFormatter,保护区域设置但丢失日期组件

在iPhone上使用NSDateFormatter,保护区域设置但丢失日期组件,iphone,nsdateformatter,Iphone,Nsdateformatter,这是一个有点棘手的问题。我在iPhone上使用了NSDateFormatter,但我只想显示一个标准日期,没有年份组件。但保留用户日期的区域设置格式 我可以使用 [dateFormatter setDateFormat:@"h:mma EEEE MMMM d"]; // hurl.ws/43p9 (date formatting) 但是现在日期是在我的英语新西兰格式,例如7月7日星期三下午12:01。因此,我已经完全消除了世界上任何其他用户的语言环境 我想说 给我这个的正确本地化日期 用户区

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

我可以使用

[dateFormatter setDateFormat:@"h:mma EEEE MMMM d"];  // hurl.ws/43p9 (date formatting)
但是现在日期是在我的英语新西兰格式,例如7月7日星期三下午12:01。因此,我已经完全消除了世界上任何其他用户的语言环境

我想说

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


由于日期显示为字符串,因此我尝试只从日期开始,然后从字符串中删除年份组件。

您可以尝试以下操作:

//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”
的出现,以防出现一些奇怪的额外空格或逗号。

以上答案的问题是
@“y”,
@“y”
都依赖于本地化。我只是把电脑上的日期和时间格式设置成日语、韩语和其他一些格式。你会发现,在当地语言中,有时年份用一个符号表示,有时用句号表示,或者其他一些可能性。因此,如果希望保持正确的本地化依赖性,您还需要搜索并替换所有这些可能性

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


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

从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

希望您不介意,但我还是冒昧地添加了一行来首先设置日期样式-如果您不设置日期样式dateFormat,则不会返回任何内容(也不会在没有设置dateStyle或dateFormat的情况下将日期格式化为字符串)。我正要发布同样的回复,但你以秒数击败了我!真棒的回答。我从来没有想过这样做。谢谢你的回答,如果你问我的话,这是非常好的。从外观上看,这对亚洲语言不太适用。请尝试Jeffery/Amir的答案。让我自己更正一下,类方法
+dateFormatFromTemplate:options:locale:
看起来足够聪明,可以修复日期字符串格式。例如,如果我给它一个模板
@“d-MMMM”
,它将返回
MMMM d
,用于美国本地化和
M月D日用于日语。所以,很明显,你可以删除一些固定本地化的组件,然后将其转换为当前的语言环境。这对我来说非常有效,似乎没有其他答案那么刻薄。你可以灵活地传递模板中的“MMMM”或“MM”,因此我认为你不需要样式。这(和Jeffery的)是正确的答案。谢谢你的例子!