NSDateFormatter - в некоторых случаях не учитывает системные настройки 12/24 часов (am / pm)

Я хочу вывести дату (с относительными датами, например Сегодня, Вчера и т. Д.) И время (с учетом настройки 12/24 часов на устройстве iOS) Например

  • Сегодня 5: 48 PM (в 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 часа для Великобритании. (Почему Apple думает, что британцам нравятся 24-часовые часы, я не знаю ...)

В работе, которую я принял, используются два NSDateFormatter, один для даты и один для времени. Похоже, что когда вы настраиваете NSDateFormatter с dateStyle NSDateFormatterNoStyle и timeStyle 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]];
}
16
задан Obliquely 29 May 2011 в 16:59
поделиться