#define BUF_SIZE 200

int

main(int argc, char *argv[])

{

time_t t;

struct tm *loc;

char buf[BUF_SIZE];

if (setlocale(LC_ALL, "") == NULL)

errExit("setlocale"); /* Использование в преобразовании настроек локали */

t = time(NULL);

printf("ctime() of time() value is: %s", ctime(&t));

loc = localtime(&t);

if (loc == NULL)

errExit("localtime");

printf("asctime() of local time is: %s", asctime(loc));

if (strftime(buf, BUF_SIZE, "%A, %d %B %Y, %H:%M:%S %Z", loc) == 0)

fatal("strftime returned 0");

printf("strftime() of local time is: %s\n", buf);

exit(EXIT_SUCCESS);

}

time/show_time.c

В SUSv3 определяются два основных способа установки значения для переменной среды TZ. Как уже было рассмотрено, значение TZ может быть установлено в виде последовательности символов, содержащей двоеточие и строку. Эта строка идентифицирует часовой пояс в том виде, который присущ конкретной реализации, как правило, в виде путевого имени файла, содержащего описание часового пояса. (В Linux и в некоторых других реализациях UNIX в этом случае допускается не ставить двоеточие, но в SUSv3 это не указывается; из соображений портируемости двоеточие нужно ставить всегда.)

Еще один метод установки значения для TZ полностью указан в SUSv3. Согласно ему, переменной TZ присваивается срока следующего вида:

std offset [dst [offset][, start-date [/time], end-date [/time]]]

Пробелы включены в показанную выше строку для удобства чтения, но в значении TZ их быть не должно. Квадратные скобки ([]) используются для обозначения необязательных компонентов. Компоненты std и dst — это строки, показывающие стандартный часовой пояс и часовой пояс с учетом действия режима летнего времени; например CET и CEST для центральноевропейского времени и центральноевропейского летнего времени. Смещение offset в каждом случае указывается положительным или отрицательным корректировочным значением, которое прибавляется к местному времени для его преобразования во время UTC. Последние четыре компонента предоставляют правило, описывающее период перехода со стандартного на летнее время.

Даты могут указываться в разных формах, одной из которых является Mm.n.d. Эта запись означает день d (0 = воскресенье, 6 = суббота) недели n (от 1 до 5, где 5 всегда означает последний d день) месяца m (от 1 до 12). Если время опущено, его значение в любом случае устанавливается по умолчанию на 02:00:00 (2 AM).

Определить TZ для Центральной Европы, где стандартное время на час опережает UTC и режим летнего времени (DST) вводится с последнего воскресенья марта до последнего воскресенья октября, а местное время опережает UTC на два часа, можно следующим образом:

TZ="CET-1:00:0 °CEST-2:00:00,M3.5.0,M10.5.0"

Время перехода на режим летнего времени не показано, поскольку переход осуществляется в устанавливаемое по умолчанию время 02:00:00. Разумеется, предыдущая форма менее удобочитаема, чем ее ближайший эквивалент:

TZ=":Europe/Berlin"

10.4. Локали

В мире говорят на нескольких тысячах языков, существенная часть которых постоянно используется в компьютерных системах. Кроме того, в разных странах есть разные соглашения для отображения такой информации, как числа, денежные суммы, даты и показания времени. Например, в большинстве европейских стран для отделения целой части от дробной в действительных числах используется запятая, а не точка и в большинстве стран используются форматы для записи дат, отличающиеся от формата MM/DD/YY, принятого в США. В SUSv3 локаль характеризуется как «подмножество переменных пользовательской среды, которые зависят от языковых и культурных норм».

В идеале все программы, созданные для работы в более чем одном месте, должны работать с локалью, чтобы отображаемая и вводимая информация была в привычном для пользователя формате и на его языке. Возникает весьма непростой вопрос интернационализации. В идеальном мире программа была бы создана как единое целое, а затем, в зависимости от того, где именно она запускается, она бы автоматически правильно обрабатывала ввод/вывод, то есть решала бы задачу локализации. Интернационализация программ — весьма затратная задача, для облегчения которой доступно множество различных средств. Библиотеки, и в частности glibc, предоставляют возможности, облегчающие локализацию.

Термин «интернационализация» (internationalization) часто записывается в виде i18N, то есть в виде I плюс 18 букв плюс N. Кроме того, что в таком виде это слово записывается быстрее, данная запись устраняет различия в его написании, существующие в английском и американском вариантах английского языка.

Определения локали

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

Перейти на страницу:

Похожие книги