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

时间:2010-09-22 18:36:06

标签: iphone date nsdateformatter

我正在使用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)”。

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

感谢。

3 个答案:

答案 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的自定义扩展/类别。