2011-08-16 40 views
4

有时我的代码正在返回a.m.或p.m.但不总是。它的大部分只是返回我所期望的时间,这是一样的东西:20110815170852164为什么我的NSDateFormatter有时会返回a.m.或p.m.与yyyyMMddHHmmssSSS?

但是有时候它返回:20100412010241 a.m.450

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:@"yyyyMMddHHmmssSSS"]; 
NSString *dateString = [dateFormatter stringFromDate:[NSDate date]]; 

可能是什么造成的?用户iPhone上的具体日期/时间国家设置?我把这个交给了成千上万的人,而且大多数人都没有回到上午(这是预期的),但其他人却没有。为什么?

+0

帮我解决这个问题 http://stackoverflow.com/questions/15162835/how-to-use-nsdateformatter-to-venezuela – tony

回答

13

你所描述的问题是一个已知的错误。 Check out some discussion on the problem on stackoverflow,你可以在那里找到一些可能的解决方法。

这里是错误的huyz的交代的摘录:

的问题来自NSDateFormatter不知何故,该用户手动选择12或24小时时间模式“卡住”。因此,如果法国用户手动选择12小时模式,并且应用程序请求NSDateFormatter以24小时格式“HHmm”输出时间,则其实际上将以12小时格式(例如, “01:00 PM”,好像应用程序改为请求“hhmm aa”。如果美国用户手动选择24小时模式,则会发生相反情况:使用12小时制格式“hhmm aa”输出时间实际上会让您以24小时格式获得时间,例如, “17:00“。

+1

好了,苹果已经宣布,它不是一个“错误”,这是一个“功能”(在这种情况下更恰当地拼写为“feechure”)。 –

3

没错。解决方案是显式设置日期格式化程序的区域设置,最好是en_US_POSIX。请参阅this问题的最终答案。

3

我正在研究一个项目的数据共享功能,这个功能在很大程度上取决于事先输入的值/结果,当我遇到同样的问题时。我实施了一个令人讨厌的小解决方法,将正确的日期时间以24h格式保存到数据库中。

的解决方案是非常简单的

首先,我从设备获取本地日期:

NSDate* now = [NSDate date]; 

第二步是建立与我们NSDateFormatter区域,无论系统的语言环境,以确保那么“PM”将会是“PM”:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]]; 

然后,我得到日期(年,月,日)为一个字符串:

[formatter setDateFormat:@"yyyy-MM-dd"]; 
NSString *date = [formatter stringFromDate:now]; 

在接下来的部分,我得到的小时,分​​钟和秒:

[formatter setDateFormat:@"hh"]; 
NSString *hours = [formatter stringFromDate:now]; 
[formatter setDateFormat:@"mm"]; 
NSString *minutes = [formatter stringFromDate:now]; 
[formatter setDateFormat:@"ss"]; 
NSString *seconds = [formatter stringFromDate:now]; 

接下来,我得到了一天的一部分:

[formatter setDateFormat:@"a"]; 
NSString *partOfDay = [formatter stringFromDate:now]; 

然后是逻辑:如果一天的部分时间是PM,但小时数少于12,我们只需要纠正这一点。在代码:

if([partOfDay isEqualToString:@"PM"] && [hours intValue] < 12) { 
    hours = [[NSString alloc] initWithFormat:@"%i", ([hours intValue] + 12)]; 
} 

此修改后,我们准备把串起来,才能有一个日期时间随时可以保存到SQL:

NSString *sqlDateTime = [[NSString alloc] initWithFormat:@"%@ %@:%@:%@", date, hours, minutes, seconds]; 

这一切就是这么简单。从现在起,我们只能希望苹果能够解决这个问题,使它能够正常工作。

我希望这会有所帮助。

+1

如果语言环境与en_US不同,并且“PM”不是“PM”,该怎么办? –

+0

AM和PM来自拉丁语'ante meridiem'和'post meridiem'短语,意思是在中午之前/之后。他们不用于任何其他语言,但英语。 (http://en.wikipedia.org/wiki/12-hour_clock) 我试图找到等价物,但没有成功,所以我认为你的场景 - 尽管它非常有效 - 永远不会发生。 –

+1

它发生了。 AM/PM是本地化的。我可以证明希伯来语相当于。 –

相关问题