Как использовать функции даты и времени C в UNIX? - PullRequest
6 голосов
/ 01 ноября 2009

Джон Скит говорил о сложности программирования дат и времени на DevDays 2009 в Лондоне.

Можете ли вы дать мне представление о функциях даты / времени ANSI C в UNIX и указать некоторые более глубокие проблемы, которые следует учитывать при использовании даты и времени?

1 Ответ

16 голосов
/ 01 ноября 2009

Терминология

Дата / время могут быть в двух форматах:

  • календарное время (a.k.a. simpletime) - время как абсолютное значение, обычно начиная с некоторого базового времени, часто называемого всемирным координированным временем
  • местное время (например, разбитое время) - календарное время, состоящее из компонентов года, месяца, дня и т. Д., Которое учитывает местный часовой пояс, включая летнее время, если применимо.

Типы данных

Функции и типы даты / времени объявлены в заголовочном файле time.h.

Время может быть сохранено как целое число или как экземпляр структуры:

  • как число, использующее арифметический тип time_t - для сохранения календарного времени в виде количества секунд, прошедших с начала UNIX 1 января 1970 года 00: 00: 00

  • с использованием структуры timeval - для сохранения календарного времени в виде количества секунд и наносекунд, прошедших с эпохи UNIX 1 января 1970 г. 00: 00: 00

  • , использующий структуру tm для хранения локального времени, он содержит такие атрибуты, как:

    tm_hour  
    tm_min  
    tm_isdst  
    

Приведенный выше атрибут tm_isdst используется для указания летнего времени (DST). Если значение положительное, то это DST, если значение 0, то это не DST.

Программа для печати текущего всемирного координированного времени

#include <stdio.h>
#include <time.h>

int main ( int argc, char *argv[] )
{
    time_t now;

    now = time ( NULL );

    printf ( "It’s %ld seconds since January 1, 1970 00:00:00", (long) now );

    return 0;
}

В программе выше функции время считывает системное время UNIX, вычитает его с 1 января 1970 года 00:00:00 (эпоха UNIX) и возвращает его результат в секундах.

Программа для печати текущего местного времени

#include <stdio.h>
#include <time.h>

int main ( int argc, char *argv[] )
{
    time_t now;
    struct tm *lcltime;

    now = time ( NULL );
    lcltime = localtime ( &now );

    printf ( "The time is %d:%d\n", lcltime->tm_hour, lcltime->tm_min );

    return 0;
}

В программе выше функции localtime преобразует прошедшее время в секундах с эпохи UNIX в сломанное время. localtime читает окружение UNIX TZ (через вызов функции tzset), чтобы вернуть время относительно часового пояса и установить атрибут tm_isdst.

Типичная настройка переменной TZ в UNIX (с использованием bash) будет выглядеть следующим образом:

export TZ=GMT

или

export TZ=US/Eastern

Программа для печати текущего отформатированного среднего времени по Гринвичу

#include <stdio.h>
#include <time.h>

int main ( int argc, char *argv[] )
{
    time_t now;
    struct tm *gmt;
    char formatted_gmt [50];

    now = time ( NULL );
    gmt = gmtime ( &now );

    strftime ( formatted_gmt, sizeof(formatted_gmt), "%I:%M %p", gmt );
    printf ( "The time is %s\n", formatted_gmt );

    return 0;
}

В программе выше функция strftime обеспечивает специализированное форматирование дат.

Другие вопросы для рассмотрения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...