iphone - NSDateFormatter - 在某些情况下不尊重 12/24 小时(am/pm)系统设置

标签 iphone nsdateformatter

我想输出一个日期(具有相对日期,例如今天、昨天等)和时间(尊重 iOS 设备上的 12/24 小时设置)例如

  • 今天下午 5:48(处于 12 小时模式时);和
  • 今天 17:48(处于 24 小时模式时)

像这样配置 NSFormatter(并使用 stringFromDate:)不起作用:

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale: [NSLocale autoupdatingCurrentLocale]];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];  // doesn't respect am/pm setting on iOS device (grrr!)
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setDoesRelativeDateFormatting:YES]; // but does get relative dates

这为您提供相对日期,但默认为区域设置的 12/24 设置,例如美国 12 小时,英国 24 小时。 (为什么苹果认为英国人喜欢 24 小时制,我不知道......)

我采用的解决方法是使用两个 NSDateFormatters,一个用于日期,一个用于时间。看起来,当您使用 NSDateFormatterNoStyle 的 dateStyle 和 NSDateFormatterShortStyle 的 timeStyle 配置 NSDateFormatter 时,它确实遵循 12/24 小时设置。 (所以只有当您同时设置了日期和时间样式时才会出现问题。)

我在下面列出了我的解决方法,以防其他人遇到类似问题。有没有更简单的方法来做到这一点?解决办法似乎有点尴尬,而且不清楚我应该对它在 iOS 的 future 版本中继续工作有多大信心。

解决办法

- (NSString*) humanRelativeDateAndTimeAlt: (NSDate*) date;
{

NSDateFormatter* relativeDateFormatter = [[NSDateFormatter alloc] init];
[relativeDateFormatter setLocale: [NSLocale autoupdatingCurrentLocale]];
[relativeDateFormatter setTimeStyle:NSDateFormatterNoStyle]; // no time for this formatter
[relativeDateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setDoesRelativeDateFormatting:YES]; // relative dates

NSString* datePart = [[self relativeDateFormatter] stringFromDate:date];

NSDateFormatter* timeDateFormatter = [[NSDateFormatter alloc] init];
[timeDateFormatter setLocale:[NSLocale autoupdatingCurrentLocale]];
[timeDateFormatter setDateStyle: NSDateFormatterNoStyle]; // no date for this formatter
[timeDateFormatter setTimeStyle: NSDateFormatterShortStyle]; // does respect 12/24 hour setting

NSString* timePart = [timeDateFormatter stringFromDate:date];

int skipZero = 0;  // extra code to remove leading zero if present 
if ([[timePart substringToIndex:1] isEqualToString:@"0"]) skipZero = 1;

[relativeDateFormater release];
[timeDateFormatter release];

return [NSString stringWithFormat:@"%@ %@", datePart, [timePart substringFromIndex:skipZero]];
}

最佳答案

此行为的原因是区域设置,设置正确的区域设置,将 NSDateFormatter 的本地设置设置为 en_US_POSIX 将解决此问题。 它适用于 24 小时和 12 小时格式。

来自Apple doc :

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.

引用:What is the best way to deal with the NSDateFormatter locale “feature”?

关于iphone - NSDateFormatter - 在某些情况下不尊重 12/24 小时(am/pm)系统设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6169074/

相关文章:

iphone - 有没有更好的方法来处理这个字典搜索?

iphone - 集成 facebook ios api 时出现 clang 错误

ios - iPhone平滑草图绘制算法

ios - 将 NSString 转换为 NSDate,添加时间

ios - NSDateFormatter 中的无效日期

iphone - 创建没有导航栏按钮的弹出菜单

ios - 删除 AVAudioSessionPortBuiltInMic 作为选项

ios - 尝试在 UIDatePicker 中显示 Am 和 Pm

ios - 字符串格式的日期选择器日期已关闭

ios - 解析日期并将休息日减 1,nsdate