NSDateFormatter,我做错了什么或这是一个错误?

我试图以某种格式打印date:

NSDate *today = [[NSDate alloc] init]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyyMMddHHmmss"]; NSString *dateStr = [dateFormatter stringFromDate:today]; 

如果iPhone设置为24小时制,则工作正常,但另一方面,如果用户已将其设置为24小时制,则返回AM / PM(直到您切换此设置才能正常工作),则会将AM追加到AM /下午,尽pipe我没有要求:

 20080927030337 PM 

我做错了什么或者这是固件2.1的错误?

编辑1:使描述更清晰

编辑2解决方法:事实certificate,这是一个错误,解决它我把AM和PM字符设置为“”:

 [dateFormatter setAMSymbol:@""]; [dateFormatter setPMSymbol:@""]; 

使用您在2.1版固件和24小时时间的模拟器和手机上发布的代码,我从来没有将AM / PM追加到dateStr当中,

 NSLog(@"%@", dateStr); 

你用dateStr做了其他的事吗? 你如何检查价值?

跟进

尝试closuresam / pm设置。 我也没有这个问题,直到我这样做。 我打印出来的方式与你一样。

好的,我也看到了。 这是一个错误。 我build议你提交一个错误报告 ,并在此期间检查并过滤掉不需要的字符。

这种行为的原因是Locale,设置正确的Locale,将NSDateFormatter的本地设置为en_US_POSIX将会解决这个问题。 它适用于24小时制和12小时制。

On iPhone OS, the user can override the default AM/PM versus 24-hour time setting (via Settings > General > Date & Time > 24-Hour Time), which causes NSDateFormatter to rewrite the format string you set. 从苹果文件

尝试这个,

 NSDate *today = [[NSDate alloc] init]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; [dateFormatter setDateFormat:@"yyyyMMddHHmmss"]; NSString *dateStr = [dateFormatter stringFromDate:today]; 

这里是对iPhone SDK错误的解释(在3.1 beta SDK中也是如此)

首先,在iPhone用户界面的一点背景。 当iPhone用户在“美国”和“法国”之间更改区域格式时,用户的“24小时制”设置会自动切换到该地区最stream行的模式。 在法国,这将把24小时制设定为“开”,在美国则将其设定为“关”。 然后,用户可以手动覆盖该设置,这就是麻烦开始的地方。

问题来自NSDateFormatter以某种方式在用户手动select的12或24小时时间模式中“卡住”。 因此,如果法国用户手动select12小时模式,并且应用程序要求NSDateFormatter以24小时格式“HHmm”输出时间,则实际上将以12小时格式(例如“01:00 PM”)接收时间,就好像应用程序已经请求“hhmm aa”一样。 如果美国用户手动select24小时模式,则会发生相反的情况:使用12小时格式“hhmm aa”输出时间实际上会以24小时格式获得时间,例如“17:00”。

更多细节和可能的解决方法可以在这个博客上find。

将date格式化程序的语言环境设置为en_US为我解决了这个问题:

  NSDateFormatter * f = [[NSDateFormatter alloc] init]; [f setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"]; f.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; f.calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; f.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]; 

我不确定是否也需要添加日历,但是这个效果很好。

我认为这是解决scheme。

 NSDateFormatter *df =[[NSDateFormatter alloc] init]; [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; [df setLocale: usLocale]; [usLocale release]; NSDate *documento_en_Linea =[[[NSDate alloc] init]autorelease]; documento_en_Linea=[df dateFromString:@"2010-07-16 21:40:33"]; [df release]; NSLog(@"fdocumentoenLineaUTC:%@!",documento_en_Linea); //ouput fdocumentoenLineaUTC:2010-07-16 09:40:33 pm -0500! 

对于那些想要使用NSDateFormatter来parsing24小时时间的用户而言,如果使用NSDateComponentsparsing具有已知格式的date和时间,将会避免这个问题:

 NSString *dateStr = @"2010-07-05"; NSString *timeStr = @"13:30"; NSDateComponents *components = [[NSDateComponents alloc] init]; components.year = [[dateStr substringToIndex:4] intValue]; components.month = [[dateStr substringWithRange:NSMakeRange(5, 2)] intValue]; components.day = [[dateStr substringFromIndex:8] intValue]; components.hour = [[timeStr substringToIndex:2] intValue]; components.minute = [[timeStr substringFromIndex:3] intValue]; NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDate *date = [calendar dateFromComponents:components]; [components release]; [calendar release]; 

这也应该(我看到一些bizzare结果)。

 -(NSString*)lowLevTime:(NSString*)stringFormat { char buffer[50]; const char *format = [stringFormat UTF8String]; time_t rawtime; struct tm * timeinfo; time(&rawtime); timeinfo = localtime(&rawtime); strftime(buffer, sizeof(buffer), format, timeinfo); return [NSString stringWithCString:buffer encoding:NSASCIIStringEncoding]; } 

简短的回答:尝试[dateFormatter setDateFormat:@"yyyyMMddhhmmss"]; 为12小时格式(注意小写hh )。

这是一个令人沮丧的话题,因为如此多的网站表示使用HH几个小时(包括官方的苹果文档),但它将其设置为24小时制,而hh使用12小时制。 有关更多详细信息,请参阅http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

作为一个奖励,请注意,您也可以使用KKKK格式的一天中的小时,这可能会被closures。

更新:我最近在看NSLocale(https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSLocale_Class/Reference/Reference.html),似乎你可以使用autoupdatingCurrentLocale将从应用程序中所做的更改应用到区域设置。; 这样做的结果是,即使手机设置为使用24小时制(如切换到法国时),也可以为应用程序制作12/24切换,而不会影响手机上的任何其他应用程序,或要求您离开应用程序进行更改。