NSDateFormatter - 在某些情况下不遵守12/24小时(上午/下午)系统设置

Obl*_*ely 16 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
Run Code Online (Sandbox Code Playgroud)

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

我采用的一种解决方法是使用两个NSDateFormatters,一个用于日期,一个用于时间.看来,当你配置一个NSDateFormatter,其日期风格为NSDateFormatterNoStyle,时间风格为NSDateFormatterShortStyle时,它确实尊重12/24小时设置.(所以只有在您设置了日期和时间样式时才会出现问题.)

我把我的工作包括在下面以防其他人有类似的问题.有更简单的方法吗?这个工作看起来有点尴尬,我不清楚它应该是多么自信,它将继续在未来的iOS版本中工作.

解决

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

Tos*_*lji 11

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

来自Apple doc:

在iPhone OS上,用户可以覆盖默认的AM/PM与24小时时间设置(通过设置>常规>日期和时间> 24小时时间),这会导致NSDateFormatter重写您设置的格式字符串.

参考:处理NSDateFormatter语言环境"功能"的最佳方法是什么?


Ben*_*nor 3

我遇到了同样的问题。我已将其作为一个错误向 Apple 提出,并将其发布在 Open Radar 上:

http://openradar.appspot.com/9774877