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