当iPhone设置为12小时制时,NSDateFormatter

Tom*_*m W 6 iphone date nsdateformatter

我正在使用NSDateFormatter将NSDate格式化为"dd MMMM YYYY"格式为"HH:mm".

这是我写的代码:

[dateFormatter setDateFormat:@"HH:mm 'on' dd MMMM YYYY"];
[dateFormatter setLocale:[NSLocale currentLocale]];
Run Code Online (Sandbox Code Playgroud)

然后我使用stringFromDate方法更新标签以显示"2010年9月22日12:45的数据".

NSString *timeAndDateUpdated = [[NSString alloc] initWithFormat:@"Data from %@.", [dateFormatter stringFromDate:date]]
Run Code Online (Sandbox Code Playgroud)

如果iPhone上的时间设置为24小时,则标签会正确更新,但如果设置为12小时,则标签会显示"数据来自(null)".

有谁知道如何解决这个问题?

谢谢.

Nat*_*own 15

我也碰到了这个.

看起来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]];
Run Code Online (Sandbox Code Playgroud)


tc.*_*tc. 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]];
Run Code Online (Sandbox Code Playgroud)

另请注意,配置NSDateFormatter 非常昂贵(大约10毫秒IIRC).如果您只打算显示一次并且不经常更新,那就没关系了,但是如果每个表格单元格有一个日期,则会使滚动速度变慢.我最近通过缓存日期格式化程序将图形绘制速度提高了50倍......