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("%s\n", 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
| Строка, представляющая положительный и отрицательный ответы. |