Я хочу вывести дату (которая имеет относительные даты, например, сегодня, вчера и т. Д.) И время (в соответствии с настройкой 12/24 часов на устройстве iOS) Например,
- Сегодня 17: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 часа для Великобритании. (Почему Apple думает, что британцы любят 24-часовые часы, я не знаю ...)
Обходной путь, который я принял, использует два NSDateFormatters, один для даты и один для времени. Похоже, что когда вы конфигурируете 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]];
}