Выполнив эту программу, вы получите хорошее соответствие текущим времени и дате:
$ ./gmtime; date
Raw time is 1179644196
gmtime gives:
date: 107/05/20
time: 06:56:36
Sun May 20 07:56:37 BST 2007
Как
это работает
Программа вызывает функцию
time
для получения машинного представления значения времени и затем вызывает функцию gmtime для преобразования его в структуру с удобными для восприятия значениями времени и даты. Она выводит на экран полученные значения с помощью функции
printf
. Строго говоря, выводить необработанное значение времени таким способом не следует, потому что наличие типа длинного целого не гарантировано во всех системах. Если сразу же после вызова функции gmtime выполнить команду date, можно сравнить оба вывода.
Но здесь у вас возникнет небольшая проблема. Если вы запустите эту программу в часовом поясе, отличном от Greenwich Mean Time (время по Гринвичу) или у вас действует летнее время, как у нас, вы заметите, что время (и, возможно, дата) неправильное. Все дело в том, что функция
gmtime
возвращает время по Гринвичу (теперь называемое Universal Coordinated Time (всеобщее скоординированное время) или UTC). Системы Linux и UNIX поступают так для синхронизации всех программ и систем в мире. Файлы, созданные в один и тот же момент в разных часовых поясах, будут отображаться с одинаковым временем создания. Для того чтобы посмотреть местное время, следует применять функцию
localtime
.
#include <time.h>
struct tm *localtime(const time_t *timeval);
Функция
localtime
идентична функции
gmtime
за исключением того, что она возвращает структуру, содержащую значения с поправками на местный часовой пояс и действующее летнее время. Если вы выполните программу
gmtime
, но замените все вызовы функции
gmtime
на вызовы
localtime
, в отчете программы вы увидите правильные время и дату.
Для преобразования разделенной на элементы структуры tm в общее внутреннее значение времени можно применить функцию
mktime
:
#include <time.h>
time_t mktime(struct tm *timeptr);
Функция
mktime
вернет -1, если структура не может быть представлена как значение типа
time_t
.
Для вывода программой
date
"дружественных" (в противоположность машинному) времени и даты можно воспользоваться функциями
asctime
и
ctime
:
#include <time.h>
char *asctime(const struct tm *timeptr);
char *ctime(const time_t *timeval);
Функция
asctime
возвращает строку, представляющую время и дату, заданные
tm
– структурой
timeptr
. У возвращаемой строки формат, подобный приведенному далее:
Sun Jun 9 12:34:56 2007\n\0
У нее всегда фиксированный формат длиной 26 символов. Функция
ctime
эквивалентна следующему вызову:
asctime(localtime(timeval))
Она принимает необработанное машинное значение времени и преобразует его в местное время.
А теперь выполните упражнение 4.8.
Упражнение 4.8. Функция
ctime
В этом примере благодаря приведенному далее программному коду вы увидите функцию
ctime
в действии.
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main {
time_t timeval;
(void)time(&timeval);
printf ("The date is: %s", ctime(&timeval));
exit(0);
}
Откомпилируйте и затем запустите на выполнение ctime.c, и вы увидите нечто похожее на приведенные далее строки:
$ ./ctime
The date is: Sat Jun 9 08:02:08 2007.
Как это работает
Программа ctime.c вызывает функцию
time
для получения машинного значения времени и дает возможность функции
ctime
выполнить всю тяжелую работу по преобразованию этого значения в удобочитаемую строку, которую потом и выводит на экран.
Для лучшего управления точным форматированием времени и даты ОС Linux и современные UNIX-подобные системы предоставляют функцию
strftime
. Она довольно похожа на функцию
sprintf
для дат и времени и действует аналогичным образом:
форматирует время и дату, представленные в структуре
tm
, на которую указывает параметр,
timeptr
, и помещает результат в строку
s
. Эта строка задается длиной
maxsize
(как минимум) символов. Строка
format
применяется для управления символами, записываемыми в строку. Как и в функции
printf
, она содержит обычные символы, которые будут переданы в строку, и спецификаторы преобразований для форматирования элементов времени и даты. В табл. 4.3 перечислены используемые спецификаторы преобразований.