Создавая и Используя объекты 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

Используйте строки формата для указания пользовательских форматов

Как правило, Вы призваны использовать предопределенные стили, локализующиеся системой. Существует, тем не менее, вообще говоря две ситуации, в которых необходимо использовать пользовательские форматы:

  1. Для строк фиксированного формата, как интернет-даты.

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

Фиксированные форматы

Для указания пользовательского фиксированного формата для средства форматирования даты Вы используете setDateFormat:. Строка формата использует образцы формата из Технического стандарта № 35 Unicode. Версия стандарта меняется в зависимости от выпуска операционной системы:

Следующий пример иллюстрирует использование пользовательской строки формата. (Отметьте использование 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