Создавая и Используя объекты CFDateFormatter
Средства форматирования даты форматируют текстовое представление объектов даты и преобразовывают текстовые представления дат и времени в объекты даты. Вы создаете объекты средства форматирования даты путем указания локали (обычно текущая локаль пользователя) и стиль времени, можно также указать пользовательскую строку формата.
Создание средств форматирования даты
Вы создаете средство форматирования даты с помощью функции CFDateFormatterCreate
. Вы указываете локаль для формата и стили для частей даты и времени формата. Вы используете CFDateFormatterCreateStringWithDate
преобразовать дату в текстовое представление.
CFDateFormatter определяет несколько стилей форматирования даты и времени — короткий, средний, долго, и полный. Это также определяет стиль «ни одного» это, можно использовать для подавления вывода компонента. Использование стилей проиллюстрировано в Стилях Средства форматирования Использования для Подарить Датам и времени Предпочтения Пользователя. Стили даты и времени не указывают точный формат — они зависят от локали, настроек пользовательской настройки и версии операционной системы. Если Вы хотите точный формат, используйте CFDateFormatterSetFormat
функционируйте для изменения строк формата, как показано в Строках формата Использования для Указания Пользовательских Форматов.
Используйте стили средства форматирования для подарить датам и времени предпочтения пользователя
Следующий пример кода создает средство форматирования даты, обеспечивающее полное представление даты с помощью kCFDateFormatterLongStyle
стиль.
CFDateRef date = CFDateCreate(NULL, 123456); |
CFLocaleRef currentLocale = CFLocaleCopyCurrent(); |
CFDateFormatterRef dateFormatter = CFDateFormatterCreate |
(NULL, currentLocale, kCFDateFormatterLongStyle, kCFDateFormatterLongStyle); |
CFStringRef formattedString = CFDateFormatterCreateStringWithDate |
(NULL, dateFormatter, date); |
CFShow(formattedString); |
// Memory management |
CFRelease(date); |
CFRelease(currentLocale); |
CFRelease(dateFormatter); |
CFRelease(formattedString); |
// Output (for en_US locale): January 2, 2001 2:17:36 AM PST |
Следующий пример показывает использование kCFDateFormatterNoStyle
подавить вывод компонента времени.
CFDateRef date = CFDateCreate(NULL, 123456); |
CFLocaleRef currentLocale = CFLocaleCopyCurrent(); |
CFDateFormatterRef dateFormatter = CFDateFormatterCreate |
(NULL, currentLocale, kCFDateFormatterShortStyle, kCFDateFormatterNoStyle); |
CFStringRef formattedString = CFDateFormatterCreateStringWithDate |
(NULL, dateFormatter, date); |
CFShow(formattedString); |
// Memory management |
CFRelease(date); |
CFRelease(currentLocale); |
CFRelease(dateFormatter); |
CFRelease(formattedString); |
// Output (for en_US locale): 1/2/01 |
Пример кода, показанный в Перечислении 1, форматирует значение даты с помощью различных стилей в качестве сравнения. В целях иллюстрации выборка указывает определенную локаль.
Перечисление 1 , Сравнивающее стили формата даты
CFDateRef date = CFDateCreate(NULL, 123456); |
CFStringRef enUSLocaleIdentifier = CFSTR("en_US"); |
CFLocaleRef enUSLocale = CFLocaleCreate(NULL, enUSLocaleIdentifier); |
// Create different date formatters |
CFDateFormatterRef shortFormatter = CFDateFormatterCreate |
(NULL, enUSLocale, kCFDateFormatterShortStyle, kCFDateFormatterShortStyle); |
CFDateFormatterRef mediumFormatter = CFDateFormatterCreate |
(NULL, enUSLocale, kCFDateFormatterMediumStyle, kCFDateFormatterMediumStyle); |
CFDateFormatterRef longFormatter = CFDateFormatterCreate |
(NULL, enUSLocale, kCFDateFormatterLongStyle, kCFDateFormatterLongStyle); |
CFDateFormatterRef fullFormatter = CFDateFormatterCreate |
(NULL, enUSLocale, kCFDateFormatterFullStyle, kCFDateFormatterFullStyle); |
// Create formatted strings |
CFStringRef shortString = CFDateFormatterCreateStringWithDate |
(NULL, shortFormatter, date); |
CFStringRef mediumString = CFDateFormatterCreateStringWithDate |
(NULL, mediumFormatter, date); |
CFStringRef longString = CFDateFormatterCreateStringWithDate |
(NULL, longFormatter, date); |
CFStringRef fullString = CFDateFormatterCreateStringWithDate |
(NULL, fullFormatter, date); |
fprintf(stdout, "Short formatted date = %s\n", |
CFStringGetCStringPtr(shortString, CFStringGetSystemEncoding())); |
fprintf(stdout, "Medium date = %s\n", |
CFStringGetCStringPtr(mediumString, CFStringGetSystemEncoding())); |
fprintf(stdout, "Long formatted date = %s\n", |
CFStringGetCStringPtr(longString, CFStringGetSystemEncoding())); |
fprintf(stdout, "Full formatted date = %s\n\n", |
CFStringGetCStringPtr(fullString, CFStringGetSystemEncoding())); |
// Memory management |
CFRelease(date); |
CFRelease(enUSLocale); |
CFRelease(shortFormatter); |
CFRelease(mediumFormatter); |
CFRelease(longFormatter); |
CFRelease(fullFormatter); |
CFRelease(shortString); |
CFRelease(mediumString); |
CFRelease(longString); |
CFRelease(fullString); |
// Output |
Short formatted date = 1/2/01 2:17 AM |
Medium date = Jan 2, 2001 2:17:36 AM |
Long formatted date = January 2, 2001 2:17:36 AM PST |
Full formatted date = Tuesday, January 2, 2001 2:17:36 AM PST |
Используйте строки формата для указания пользовательских форматов
Как правило, Вы призваны использовать предопределенные стили, локализующиеся системой. Существует, тем не менее, вообще говоря две ситуации, в которых необходимо использовать пользовательские форматы:
Для строк фиксированного формата, как интернет-даты.
Для видимых пользователем элементов, не соответствующих ни одного из существующих стилей
Фиксированные форматы
Для указания пользовательского фиксированного формата для средства форматирования даты Вы используете setDateFormat:
. Строка формата использует образцы формата из Технического стандарта № 35 Unicode. Версия стандарта меняется в зависимости от выпуска операционной системы:
OS X v10.9 и iOS 7 использует версию tr35-31.
OS X v10.8 и iOS 6 использует версию tr35-25.
iOS 5 использует версию tr35-19.
OS X v10.7 и iOS 4.3 использует версию tr35-17.
iOS 4.0, iOS 4.1 и iOS 4.2 используют версию tr35-15.
iOS 3.2 использует версию tr35-12.
OS X v10.6, iOS 3.0 и iOS 3.1 использует версию tr35-10.
OS X v10.5 использует версию tr35-6.
OS X v10.4 использует версию tr35-4.
Следующий пример иллюстрирует использование пользовательской строки формата. (Отметьте использование yyyy
отформатировать год. Частая ошибка состоит в том, чтобы использовать YYYY
который представляет недельный год, не календарный год.)
CFLocaleRef currentLocale = CFLocaleCopyCurrent(); |
CFDateRef date = CFDateCreate(NULL, 123456); |
CFDateFormatterRef customDateFormatter = CFDateFormatterCreate |
(NULL, currentLocale, kCFDateFormatterNoStyle, kCFDateFormatterNoStyle); |
CFStringRef customDateFormat = CFSTR("yyyy-MM-dd*HH:mm"); |
CFDateFormatterSetFormat(customDateFormatter, customDateFormat); |
CFStringRef customFormattedDateString = CFDateFormatterCreateStringWithDate |
(NULL, customDateFormatter, date); |
CFShow(customFormattedDateString); |
// Memory management |
CFRelease(currentLocale); |
CFRelease(date); |
CFRelease(customDateFormatter); |
CFRelease(customFormattedDateString); |
// Output: 2001-01-02*02:17 |
Пользовательские форматы для видимых пользователем дат
Для отображения даты, содержащей определенный набор элементов Вы используете CFDateFormatterCreateDateFormatFromTemplate
]. Функция генерирует строку формата с компонентами даты, которые Вы хотите использовать, но с корректной пунктуацией и порядком, подходящим для пользователя (т.е. настроенный для локали и предпочтений пользователя). Вы тогда используете строку формата для создания средства форматирования.
Для понимания потребности в этом рассмотрите ситуацию, где Вы хотите вывести на экран дневное имя, день и месяц. Вы не можете создать это представление даты с помощью стилей средства форматирования (нет никакого стиля, опускающего год). Ни один, тем не менее, не может Вы легко и последовательно создавать представление правильно с помощью строк формата. Несмотря на то, что на первый взгляд это может казаться прямым, существует сложность: пользователь из США обычно ожидал бы даты в форме, “понедельник, Ян 3”, тогда как пользователь из Великобритании будет обычно ожидать даты в форме “понедельник 31 Ян”.
Следующий пример иллюстрирует тезис:
CFStringRef dateComponents = CFSTR("yMMMMd"); |
CFLocaleRef usLocale = CFLocaleCreate(NULL, CFSTR("en_US")); |
CFStringRef usDateFormatString = |
CFDateFormatterCreateDateFormatFromTemplate(NULL, dateComponents, 0, usLocale); |
// Date format for English (United States): MMMM d, y |
CFLocaleRef gbLocale = CFLocaleCreate(NULL, CFSTR("en_GB")); |
CFStringRef gbDateFormatString = |
CFDateFormatterCreateDateFormatFromTemplate(NULL, dateComponents, 0, gbLocale); |
// Date format for English (United Kingdom): d MMMM y |