Подтвердить что ты не робот

Использование NSDateFormatter на iPhone, защита локали, но потеряющих компоненты даты

Это немного сложный вопрос. Я использую NSDateFormatter на iPhone, но я хотел показывать только стандартную дату без компонента years. Но сохраните форматирование локали пользователей для своей даты.

Я мог бы легко переопределить форматирование с помощью

[dateFormatter setDateFormat:@"h:mma EEEE MMMM d"];  // hurl.ws/43p9 (date formatting)

Но теперь дата указана в моем формате en-nz, например, 12:01 PM среда, 7 июля. Поэтому я полностью убил локаль для любых других пользователей по всему миру.

Я хотел бы сказать.

Дайте мне правильную локализованную дату для этого пользователей, но опускать годы компонент.

Поскольку дата отображается в виде строки, у меня возникает соблазн только от даты, а затем удаляется компонент года, просто вырезая это из строки.

4b9b3361

Ответ 1

Вы можете попробовать что-то вроде:

//create a date formatter with standard locale, then:

// have to set a date style before dateFormat will give you a string back
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];

// read out the format string
NSString *format = [dateFormatter dateFormat];
format = [format stringByReplacingOccurrencesOfString:@"y" withString:@""];
[dateFormatter setDateFormat:format];

Вид взлома, но он должен работать.

Изменить: вы можете сначала удалить вхождения строк @"y," и @" y", если у вас появятся некоторые лишние пробелы или запятые.

Ответ 2

Из iOS 4.0 правильный способ сделать это (см. сеанс локализации от WWDC 2012), поддерживая разные варианты локали из коробки, использует следующий API, как указано выше.

+dateFormatFromTemplate:options:locale:

Например, чтобы получить длинный формат даты без года:

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];  
NSString *longFormatWithoutYear = [NSDateFormatter dateFormatFromTemplate:@"MMMM d" options:0 locale:[NSLocale currentLocale]]; 
[dateFormatter setDateFormat:longFormatWithoutYear];
//format your date... 
//output will change according to locale. E.g. "July 9" in US or "9 de julho" in Portuguese

Ответ 3

Проблема с вышеприведенным ответом заключается в том, что @"y," и @" y" зависят как от локализации. Я просто играл с настройкой формата даты и времени на моем компьютере на японский, корейский и ряд других форматов. Вы обнаружите, что иногда год представлен символом на локальном языке или иногда используется период или несколькими другими возможностями. Поэтому вам нужно будет искать и заменять все эти возможности, если вы надеетесь поддерживать правильную зависимость локализации.

Существует метод класса +dateFormatFromTemplate:options:locale:, который может помочь, хотя он не соответствует стилю даты или времени и поэтому не является гибким.

Я не уверен, что есть хорошее решение с дополнительными API от Apple. Но даже тогда не ясно, что у них есть свои локализации, разделенные на компоненты. Без этого это по существу невыполнимая задача.