Linux программирование в примерах - Роббинс Арнольд
Шрифт:
Интервал:
Закладка:
time_t now;
struct tm *curtime;
setlocale(LC_ALL, "");
time(&now);
curtime = localtime(&now);
(void)strftime(buf, sizeof buf,
"It is now %A, %B %d, %Y, %I:%M %p", curtime);
printf("%sn", buf);
printf("ctime() says: %s", ctime(&now));
exit(0);
}
При запуске программы мы видим, что результаты strftime() в самом деле варьируют, тогда как результаты ctime() — нет:
$ <b>LC_ALL=en_US ch13-times</b> /* Время в Соединенных Штатах */
It is now Friday, July 11, 2003, 10:35 AM
ctime() says: Fri Jul 11 10:35:55 2003
$ <b>LC_ALL=it_IT ch13-times</b> /* Время в Италии */
It is now venerdi, luglio 11, 2003, 10:36
ctime() says: Fri Jul 11 10:36:00 2003
$ <b>LC_ALL=fr_FR ch13-times</b> /* Время во Франции */
It is now vendredi, juillet 11, 2003, 10:36
ctime() says: Fri Jul 11 10:36:05 2003
Причина отсутствия изменений в том, что ctime() (и asctime(), на которой основана ctime()) является традиционным интерфейсом; он существует для поддержки старого кода, strftime(), будучи более новым интерфейсом (первоначально разработанным для C89), свободен использовать локали.
13.2.8. Другие данные локали: nl_langinfo()
Хотя ранее мы сказали, что API catgets() трудно использовать, одна часть этого API обычно полезна: nl_langinfo(). Она предоставляет дополнительные связанные с локалью сведения, помимо тех, которые доступны из struct lconv:
#include <nl_types.h>
#include <langinfo.h>
char *nl_langinfo(nl_item item);
Заголовочный файл <nl_types.h> определяет тип nl_item. (Это скорее всего int или enum.) Параметр item является одной из именованных констант, определенных в <langinfo.h>. Возвращаемое значение является строкой, которую можно при необходимости использовать либо непосредственно, либо в качестве форматирующей строки для strftime().
Доступная информация поступает из нескольких категорий локали. В табл. 13.3 перечислены константы элементов, соответствующие категории локали и их значения.
Таблица 13.3. Значения элементов для nl_langinfo()
Элемент Категория Значение ABDAY_1, …, ABDAY_7 LC_TIME Сокращенные названия дней недели. Воскресенье является днем 1 ABMON_1, …, ABMON_12 LC_TIME Сокращенные названия месяцев ALT_DIGITS LC_TIME Альтернативные символы для цифр; см. текст AM_STR, PM_STR LC_TIME Обозначения a.m/p.m. для локали. CODESET LC_TYPE Имя кодовой страницы для локали, т.е. использующиеся набор символов и кодировка CRNCYSTR LC_MONETARY Символ местной валюты, описанный ниже DAY_1, …, DAY_7 LC_TIME Названия дней недели. Воскресенье является днем 1 D_FMT LC_TIME Формат даты D_T_FMT LC_TIME Формат даты и времени ERA_D_FMT LC_TIME Формат даты эры. ERA_D_T_FMT LC_TIME Формат даты и времени эры. ERA_T_FMT LC_TIME Формат времени эры. ERA LC_TIME Сегменты описания эры, см. текст. MON_1, …, MON_12 LC_TIME Названия месяцев. RADIXCHAR LC_NUMERIC Символ системы счисления. Для базы 10 это символ точки в десятичной дроби. THOUSEP LC_NUMERIC Символ-разделитель тысяч T_FMT_AMPM LC_TIME Формат времени в записи a.m/p.m. T_FMT LC_TIME Формат времени. YESEXPR, NOEXPR LC_MESSAGES Строка, представляющая положительный и отрицательный ответы.