我正在使用NSDateFormatter将NSDate格式化为'dh MMMM YYYY'中的格式为“HH:mm”。
这是我写的代码:
[dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"];
[dateFormatter setLocale:[NSLocale currentLocale]];
然后我使用方法stringFromDate更新标签以显示“2010年9月22日12:45的数据”。
NSString *timeAndDateUpdated = [[NSString alloc] initWithFormat:@"Data from %@.", [dateFormatter stringFromDate:date]]
如果iPhone上的时间设置为24小时,则标签会正确更新,但如果设置为12小时,则标签会显示“数据来自(null)”。
有谁知道如何解决这个问题?
感谢。
答案 0 :(得分:14)
我也碰到了这个。
看起来NSDateFormatter根据区域设置解析日期,即使您明确指定了日期格式字符串!
因此,在这种情况下,24小时制HH被忽略,它正在尝试使用设备上设置的12小时时钟进行解析。
修复它的方法是显式覆盖NSDateFormatter的语言环境;在这个例子中,将它设置为en_US_POSIX将强制在解析小时时使用24小时时钟,即
[dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"];
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
答案 1 :(得分:6)
如果日期仅提供给用户(“on”表示它是),我不会强制使用日期格式。使用长/中/短日期和时间样式会更友好,它们的行为符合用户的区域格式:
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[timeFormatter setDateStyle:NSDateFormatterNoStyle];
[timeFormatter setTimeStyle:NSDateFormatterMediumStyle];
NSString * timeAndDate = [NSString stringWithFormat:"%@ on %@",
[timeFormatter stringFromDate:date],
[dateFormatter stringFromDate:date]];
另请注意,配置NSDateFormatter 非常昂贵(约10毫秒IIRC)。如果您只打算显示一次并且不经常更新,那就没关系了,但是如果每个表格单元格有一个日期,则会使滚动速度变慢。我最近通过缓存日期格式化程序将图形绘制速度提高了50倍......
答案 2 :(得分:0)
我使用12和24小时设置在3.1.2和4.1上运行此代码并且运行正常。
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"];
[dateFormatter setLocale:[NSLocale currentLocale]];
NSString *timeAndDateUpdated = [NSString stringWithFormat:@"Data from %@.", [dateFormatter stringFromDate:[NSDate date]]];
NSLog(@"%@", timeAndDateUpdated);
如果此代码不适合您,请检查NSDateformatter或NSDate的自定义扩展/类别。