В листинге 10.1 показывается пример использования функции asctime(), а также всех рассмотренных до сих пор в этой главе функций преобразования времени. Программа извлекает текущее календарное время, а затем использует различные функции преобразования времени и выдает результаты их работы. Далее приведен пример того, что будет показано при запуске этой программы в Мюнхене, Германия, где (зимой) применяется центральноевропейское время, на один час больше UTC:
$ date
Tue Dec 28 16:01:51 CET 2010
$ ./calendar_time
Seconds since the Epoch (1 Jan 1970): 1293548517 (about 40.991 years)
gettimeofday() returned 1293548517 secs, 715616 microsecs
Broken down by gmtime():
year=110 mon=11 mday=28 hour=15 min=1 sec=57 wday=2 yday=361 isdst=0
Broken down by localtime():
year=110 mon=11 mday=28 hour=16 min=1 sec=57 wday=2 yday=361 isdst=0
asctime() formats the gmtime() value as: Tue Dec 28 15:01:57 2010
ctime() formats the time() value as: Tue Dec 28 16:01:57 2010
mktime() of gmtime() value: 1293544917 secs
mktime() of localtime() value: 1293548517 secs
Листинг 10.1. Извлечение и преобразование значений календарного времени
time/calendar_time.c
#include
#include
#include
#include "tlpi_hdr.h"
#define SECONDS_IN_TROPICAL_YEAR (365.24219 * 24 * 60 * 60)
int
main(int argc, char *argv[])
{
time_t t;
struct tm *gmp, *locp;
struct tm gm, loc;
struct timeval tv;
t = time(NULL);
printf("Seconds since the Epoch (1 Jan 1970): %ld", (long) t);
printf(" (about %6.3f years)\n", t / SECONDS_IN_TROPICAL_YEAR);
if (gettimeofday(&tv, NULL) == -1)
errExit("gettimeofday");
printf(" gettimeofday() returned %ld secs, %ld microsecs\n",
(long) tv.tv_sec, (long) tv.tv_usec);
gmp = gmtime(&t);
if (gmp == NULL)
errExit("gmtime");
gm = *gmp; /* Сохранение локальной копии, так как содержимое, на которое указывает
*gmp, может быть изменено вызовом asctime() или gmtime() */
printf("Broken down by gmtime():\n");
printf(" year=%d mon=%d mday=%d hour=%d min=%d sec=%d", gm.tm_year,
gm.tm_mon, gm.tm_mday, gm.tm_hour, gm.tm_min, gm.tm_sec);
printf("wday=%d yday=%d isdst=%d\n", gm.tm_wday, gm.tm_yday, gm.tm_isdst);
gm.tm_isdst);
locp = localtime(&t);
if (locp == NULL)
errExit("localtime");
loc = *locp; /* Сохранение локальной копии */
printf("Broken down by localtime():\n");
printf(" year=%d mon=%d mday=%d hour=%d min=%d sec=%d",
loc.tm_year, loc.tm_mon, loc.tm_mday,
loc.tm_hour, loc.tm_min, loc.tm_sec);
printf("wday=%d yday=%d isdst=%d\n\n", loc.tm_wday, loc.tm_yday, loc.tm_isdst);
printf("asctime() formats the gmtime() value as: %s", asctime(&gm));
printf("ctime() formats the time() value as: %s", ctime(&t));
printf("mktime() of gmtime() value: %ld secs\n", (long) mktime(&gm));
printf("mktime() of localtime() value: %ld secs\n", (long) mktime(&loc));
exit(EXIT_SUCCESS);
}
time/calendar_time.c
Функция strftime() предоставляет нам более тонкую настройку управления при преобразовании разделенного календарного времени в печатный вид.
Функция strftime(), которой в аргументе timeptr передается указатель на структуру, содержащую разделенное время, возвращает соответствующую строку, завершаемую нулевым байтом, в буфер, заданный аргументом outst. В этой строке хранятся и дата и время.
#include
size_t strftime(char *
const struct
Возвращает при успешном завершении количество байтов, помещенных в строку, на которую указывает outstr (исключая завершающий нулевой байт), или 0 при ошибке
Строка, возвращенная в буфер, на который указывает outstr, отформатирована в соответствии со спецификаторами, заданными аргументом format. Аргумент maxsize указывает максимальное пространство, доступное в буфере, заданном аргументом outstr. В отличие от ctime() и asctime() функция strftime() не включает в окончание строки символ новой строки (кроме того, что включается в спецификацию формата, указываемую аргументом format).
В случае успеха функция strftime() возвращает количество байтов, помещенных в буфер, на который ссылается outstr, исключая завершающий нулевой байт. Если общая длина получившейся строки, включая завершающий нулевой байт, станет превышать количество байтов, заданное в аргументе maxsize, функция strftime() возвратит 0, чтобы показать ошибку; в этом случае содержимое буфера, на который указывает outstr, станет неопределенным.