Time.h(0p)

Examples

The Time directory contains the Time library and some example sketches
illustrating how the library can be used with various time sources:

  • shows Arduino as a clock without external hardware.
    It is synchronized by time messages sent over the serial port.
    A companion Processing sketch will automatically provide these messages
    if it is running and connected to the Arduino serial port.

  • adds day and month name strings to the sketch above.
    Short (3 characters) and long strings are available to print the days of
    the week and names of the months.

  • uses a DS1307 real-time clock to provide time synchronization.
    The basic DS1307RTC library must be downloaded and installed,
    in order to run this sketch.

  • is similar to the above and adds the ability to set the Real Time Clock.

  • demonstrates how to calculate the difference between times.
    It is a very simple logger application that monitors events on digital pins
    and prints (to the serial port) the time of an event and the time period since
    the previous event.

B10. Функции даты и времени: ‹time.h›

Скрыть рекламу в статье

B10. Функции даты и времени: ‹time.h›

Заголовочный файл <time.h> объявляет типы и функции, связанные с датой и временем. Некоторые функции имеют дело с местным временем, которое может отличаться от календарного, например в связи с зонированием времени. Типы clосk_t и time_t — арифметические типы для представления времени, a struct tm содержит компоненты календарного времени:

Значение tm_isdst — положительное, если время приходится на сезон, когда время суток сдвинуто на 1 час вперед, нуль в противном случае и отрицательное, если информация не доступна.

clock возвращает время, фиксируемое процессором от начала выполнения программы, или -1, если оно не известно. Для выражения этого времени в секундах применяется формула clock()/CLOCKS_PER_SEC.

time возвращает текущее календарное время (т. е. время, прошедшее после определенной даты, — обычно после 0 ч 00 мин 00 с GMT 1-го января 1970 г. — примеч. ред.) или -1, если время не известно. Если tp не равно NULL, то возвращаемое значение записывается и в *tp.

difftime возвращает разность time2 — time1, выраженную в секундах.

mktime преобразует местное время, заданное структурой *tp, в календарное, выдавая его в том же виде, что и функция time. Компоненты будут иметь значения в указанных диапазонах. Функция mktime возвращает календарное время или -1, если оно не представимо.

Следующие четыре функции возвращают указатели на статические объекты, каждый из которых может быть изменен другими вызовами.

asctime переводит время в структуре *tp в строку вида

ctime переводит календарное время в местное, что эквивалентно выполнению asctime(localtime(tp))

gmtime переводит календарное время во Всемирное координированное время (Coordinated Universal Time — UTC). Выдаст NULL, если UTC не известно. Имя этой функции, gmtime, происходит от Greenwich Mean Time (среднее время по Гринвичскому меридиану).

localtime переводит календарное время *tp в местное.

strftime форматирует информацию о дате и времени из *tp в строку s согласно формату fmt, который имеет много общих черт с форматом, задаваемым в функции printf. Обычные символы (включая и завершающий символ ») копируются в s. Каждая пара, состоящая из % и буквы, заменяется, как показано ниже, с использованием значений по форме, соответствующей местным традициям. В s размещается не более smax символов; strftime возвращает число символов без учета » или нуль, если число сгенерированных символов больше smax.

%a сокращенное название дня недели
%A полное название дня недели
%b сокращенное название месяца
%B полное название месяца
%c местное представление даты и времени
%d день месяца (01-31)
%H час (24-часовое время) (00-23)
%I час (12-часовое время) (01-12)
%j день от начала года (001-366)
%m месяц (01-12)
%M минута (00-59)
%p местное представление AM или РМ (до или после полудня)
%S секунда (00-61)
%U неделя от начала года (считая, что воскресенье — 1-й день недели) (00-53)
%w день недели (0-6, номер воскресенья — 0)
%W неделя от начала года (считая, что понедельник — 1-й день недели) (00-53)
%x местное представление даты
%X местное представление времени
%y год без указания века (00-99)
%Y год с указанием века
%Z название временной зоны, если она есть
%% %

Оглавление книги

COLOPHON top

       This page is part of release 5.08 of the Linux man-pages project.  A
       description of the project, information about reporting bugs, and the
       latest version of this page, can be found at
       https://www.kernel.org/doc/man-pages/.

Linux                            2019-03-06                  GETTIMEOFDAY(2)

Pages that refer to this page:
alarm(2), 
clock_getres(2), 
clock_gettime(2), 
clock_settime(2), 
getitimer(2), 
seccomp(2), 
setitimer(2), 
syscalls(2), 
time(2), 
adjtime(3), 
asctime(3), 
asctime_r(3), 
ctime(3), 
ctime_r(3), 
daylight(3), 
difftime(3), 
ftime(3), 
gmtime(3), 
gmtime_r(3), 
localtime(3), 
localtime_r(3), 
mktime(3), 
pmdaEventAddHighResMissedRecord(3), 
pmdaEventAddHighResRecord(3), 
pmdaEventAddMissedRecord(3), 
pmdaEventAddParam(3), 
pmdaEventAddRecord(3), 
pmdaeventarray(3), 
pmdaEventGetAddr(3), 
pmdaEventHighResAddParam(3), 
pmdaEventHighResGetAddr(3), 
pmdaEventNewArray(3), 
pmdaEventNewHighResArray(3), 
pmdaEventReleaseArray(3), 
pmdaEventReleaseHighResArray(3), 
pmdaEventResetArray(3), 
pmdaEventResetHighResArray(3), 
pmPrintHighResStamp(3), 
pmPrintStamp(3), 
pmtimeval(3), 
pmtimevalAdd(3), 
pmtimevalDec(3), 
pmtimevalFromReal(3), 
pmtimevalInc(3), 
pmtimevalNow(3), 
pmtimevalSub(3), 
pmtimevalToReal(3), 
timeradd(3), 
timerclear(3), 
timercmp(3), 
timerisset(3), 
timersub(3), 
timezone(3), 
tzname(3), 
tzset(3), 
uuid_time(3), 
rtc(4), 
time(7), 
vdso(7), 
hwclock(8)

17.3 Установка Сигнализаций

Функции alarm и setitimer обеспечивают механизм прерывания процесса,
в некоторое время. Они делают это,
устанавливая таймер; когда время таймер истекает, процесс получает
сигнал.

Каждый процесс имеет три доступных независимых таймера
интервала:

  • Таймер в реальном времени, который считает время как часы.
    Этот таймер посылает сигнал SIGALRM процессу, когда время истекает.
  • Виртуальный таймер, который считает процессорное время, используемое
    процессом. Этот таймер посылает сигнал SIGVTALRM процессу, когда
    время истекает.
  • Таймер профилирования, который считает оба: процессорное время,
    используемое процессом, и процессорное время, потраченное в системных
    вызовах от имени процесса. Этот таймер посылает сигнал SIGPROF
    процессу, когда время истекает.

Вы должны установить обработчик для соответствующего сигнала
alarm, используюя signal или sigaction перед обращением к setitimer
или alarm. Иначе, необычная цепочка событий может заставлить таймер
исчерпать время прежде, чем ваша программа установит обработчик, и в этом
случае она будет завершена, так как это — заданное по умолчанию
действие для сигналов alarm. См. Главу 21 .

Функция setitimer — первичный способ для установки будильника.
Это средство объявлено в заглавном файле » sys/time.h «. Функция
alarm, объявленная в » unistd.h «, обеспечивает несколько более
простой интерфейс для установки таймера в реальном времени.

Тип данных Struct timeval описан в Разделе 17.2.2 .

Если old — не пустой указатель, setitimer возвращает информацию
относительно любого предыдущего неистекшего таймера того же самого
вида в структуре, на которую он указывает.

Возвращаемое значение — 0 при успехе и -1 при отказе. Следующие
errno условия ошибки определены для этой функции:

EINVAL

интервал таймера был слишком большой.

Возвращаемое значение и условия ошибки — такие же как для
setitimer.

Возвращаемое значение указывает, сколько секунд оставалось
прежде, чем предыдущий сигнал был бы послан. Если не было никакого
предыдущего сигнала, alarm возвращает нуль.

Функция alarm могла бы быть определена в терминах setitimer
примерно так:

Если Вы просто хотите, чтобы ваш процесс ждал данное число
секунд, Вы должен использовать функцию sleep. См. Раздел 17.4
.

Вы не должны рассчитать на сигнал, прибывающий точно, когда
таймер истекает. В многопроцессорной среде имеется обычно некоторая
задержка.

Примечание Переносимости: setitimer и getitimer — функции UNIX
BSD, в то время как функция alarm определена POSIX.1 стандартом.
Setitimer более мощная чем alarm, но alarm более широко
используется.

Introduction

The Timezone library is designed to work in conjunction with the Arduino Time library, which must also be installed on your system. This documentation assumes some familiarity with the Time library.

The primary aim of the Timezone library is to convert Universal Coordinated Time (UTC) to the correct local time, whether it is daylight saving time (a.k.a. summer time) or standard time. The time source could be a GPS receiver, an NTP server, or a Real-Time Clock (RTC) set to UTC. But whether a hardware RTC or other time source is even present is immaterial, since the Time library can function as a software RTC without additional hardware (although its accuracy is dependent on the accuracy of the microcontroller’s system clock.)

The Timezone library implements two objects to facilitate time zone conversions:

  • A TimeChangeRule object describes when local time changes to daylight (summer) time, or to standard time, for a particular locale.
  • A Timezone object uses TimeChangeRules to perform conversions and related functions. It can also write its TimeChangeRules to EEPROM, or read them from EEPROM. Multiple time zones can be represented by defining multiple Timezone objects.

ATTRIBUTES top

       For an explanation of the terms used in this section, see
       attributes(7).

       ┌───────────────┬───────────────┬─────────────────────────────────┐
       │Interface      Attribute     Value                           │
       ├───────────────┼───────────────┼─────────────────────────────────┤
       │asctime()      │ Thread safety │ MT-Unsafe race:asctime locale   │
       ├───────────────┼───────────────┼─────────────────────────────────┤
       │asctime_r()    │ Thread safety │ MT-Safe locale                  │
       ├───────────────┼───────────────┼─────────────────────────────────┤
       │ctime()        │ Thread safety │ MT-Unsafe race:tmbuf            │
       │               │               │ race:asctime env locale         │
       ├───────────────┼───────────────┼─────────────────────────────────┤
       │ctime_r(),     │ Thread safety │ MT-Safe env locale              │
       │gmtime_r(),    │               │                                 │
       │localtime_r(), │               │                                 │
       │mktime()       │               │                                 │
       ├───────────────┼───────────────┼─────────────────────────────────┤
       │gmtime(),      │ Thread safety │ MT-Unsafe race:tmbuf env locale │
       │localtime()    │               │                                 │
       └───────────────┴───────────────┴─────────────────────────────────┘

Пример использования

Вывод на экран текущего времени.

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

int main(void)
{
  const time_t timer = time(NULL);
  printf("%s\n", ctime(&timer));
  return ;
}

Visual Studio 2010

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

int main(int argc, char** argv[])
{
  time_t t = time(NULL);
  struct tm* aTm = localtime(&t);
  printf("%04d/%02d/%02d %02d:%02d:%02d \n",aTm->tm_year+1900, aTm->tm_mon+1, aTm->tm_mday, aTm->tm_hour, aTm->tm_min, aTm->tm_sec);
  getchar();
  return ;
}

Запись в файл

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

int main(int argc, char** argv[])
{
  time_t t = time(NULL);
  struct tm* aTm = localtime(&t);

  FILE* hFILE = fopen("test", "w");
  fprintf(hFILE,"%04d/%02d/%02d %02d:%02d:%02d",aTm->tm_year+1900, aTm->tm_mon+1, aTm->tm_mday, aTm->tm_hour, aTm->tm_min, aTm->tm_sec);
  return ;
}

Timezone library methods

time_t toLocal(time_t utc);

Description

Converts the given UTC time to local time, standard or daylight as appropriate.

utc: Universal Coordinated Time (time_t)

Local time (time_t)

Example
time_t eastern, utc;
TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 2, -240};  //UTC - 4 hours
TimeChangeRule usEST = {"EST", First, Sun, Nov, 2, -300};   //UTC - 5 hours
Timezone usEastern(usEDT, usEST);
utc = now();	//current time from the Time Library
eastern = usEastern.toLocal(utc);

time_t toLocal(time_t utc, TimeChangeRule **tcr);

Description

As above, converts the given UTC time to local time, and also returns a pointer to the TimeChangeRule that was applied to do the conversion. This could then be used, for example, to include the time zone abbreviation as part of a time display. The caller must take care not to alter the pointed TimeChangeRule, as this will then result in incorrect conversions.

utc: Universal Coordinated Time (time_t)tcr: Address of a pointer to a TimeChangeRule (**TimeChangeRule)

Local time (time_t)
Pointer to TimeChangeRule (**TimeChangeRule)

Example
time_t eastern, utc;
TimeChangeRule *tcr;
TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 2, -240};  //UTC - 4 hours
TimeChangeRule usEST = {"EST", First, Sun, Nov, 2, -300};   //UTC - 5 hours
Timezone usEastern(usEDT, usEST);
utc = now();	//current time from the Time Library
eastern = usEastern.toLocal(utc, &tcr);
Serial.print("The time zone is: ");
Serial.println(tcr -> abbrev);

bool locIsDST(time_t local);

Description

These functions determine whether a given UTC time or a given local time is within the daylight saving (summer) time interval, and return true or false accordingly.

utc: Universal Coordinated Time (time_t)local: Local Time (time_t)

true or false (bool)

Example

void writeRules(int address);

Description

These functions read or write a Timezone object’s two TimeChangeRules from or to EEPROM.

address: The beginning EEPROM address to write to or read from (int)

None.

Example

void setRules(TimeChangeRule dstStart, TimeChangeRule stdStart);

Description

This function reads or updates the daylight and standard time rules from RAM. Can be used to change TimeChangeRules dynamically while a sketch runs.

dstStart: A TimeChangeRule denoting the start of daylight saving (summer) time.stdStart: A TimeChangeRule denoting the start of standard time.

None.

Example
TimeChangeRule EDT = {"EDT", Second, Sun, Mar, 2, -240};
TimeChangeRule EST = {"EST", First, Sun, Nov, 2, -300};
Timezone ET(EDT, EST);
...
tz.setRules(EDT, EST);
Description

Converts the given local time to UTC time.

WARNING: This function is provided for completeness, but should seldom be needed and should be used sparingly and carefully.

Ambiguous situations occur after the Standard-to-DST and the DST-to-Standard time transitions. When changing to DST, there is one hour of local time that does not exist, since the clock moves forward one hour. Similarly, when changing to standard time, there is one hour of local time that occurs twice since the clock moves back one hour.

This function does not test whether it is passed an erroneous time value during the Local-to-DST transition that does not exist. If passed such a time, an incorrect UTC time value will be returned.

If passed a local time value during the DST-to-Local transition that occurs twice, it will be treated as the earlier time, i.e. the time that occurs before the transition.

Calling this function with local times during a transition interval should be avoided!

6.8 strftime — настpаиваемое фоpматиpование календаpного вpемени

Для управления форматированием вывода используется строка в
format. *format может содержать два типа спецификаций: текст для
прямого копирования в форматируемую строку и спецификации
преобразования времени. Спецификации преобразования времени состоят из
последовательностей из двух знаков, начинающихся с % (%% включает знак
процента в вывод). Каждая определенная спецификация преобразования
выбирает поле в календарного времени, записанного в *timp, и
преобразовывает его в строку одним из следующих способов:

%a

Сокращение для дня недели.

%A

Полное имя для дня недели.

%b

Сокращение для названия месяца.

%B

Полное имя месяца.

%c

Строка, представляющая полную дату и время в виде
Mon Apr 01 13:13:13 1992

%d

День месяца, представленный двумя цифрами.

%H

Час (на 24-часовых часах), представленный двумя цифрами.

%I

Час (на 12-часовых часах), представленный двумя цифрами.

%j

Число дней в году, представленное тремя цифрами (от 001 до 366).

%m

Номер месяца, представленный двумя цифрами.

%M

Минута, представленная двумя цифрами.

%P

am или pm.

%S

Секунда, представленная двумя цифрами.

%U

Номер недели, представленный двумя цифрами (от 00 до 53; первая
неделя считается начавшейся в первое воскресенье года). Смотрите
также %w.

%w

День недели, представленный одной цифрой, воскресенье -нулем.

%W

Другая версия номера недели: как %u, но считая первую неделю с
первого понедельника года.

o %x
Строка, полностью представляющая дату в формате Mon Apr 01 1992

%X

Строка, представляющая полное время дня (часы, минуты и секунды)
в формате
13:13:13

%y

Последние две цифры года.

%Y

Полный год, фоpматиpованный в четыpе цифpы.

%Z

Определенно в ANSI C для выделения временного промежутка, если
это возможно; в данной реализации это отсутствует (%z
допускается, но по нему ничего не выводится).

%%

Знак %.

Если отформатированное время занимает не более чем maxsize
знаков, то выдается длина отформатированной строки. В противном
случае, если форматирование было прекращено из-за нехватки места, то
выдается 0 0 и строка, начинающаяся в s, соответствует тем частям
*format, которые могут быть полностью представлены в пределе maxsize
знаков.

Стандарт ANSI требует наличия функции strftime, но не
определяет содержимое *s, если отформатированная строка занимает
больше чем maxsize знаков.

strftime не требует никаких процедур ОС.

Examples

The following example sketches are included with the Timezone library:

  • Clock: A simple self-adjusting clock for a single time zone. TimeChangeRules may be optionally read from EEPROM.
  • HardwareRTC: A self-adjusting clock for one time zone using an external real-time clock, either a DS1307 or DS3231 (e.g. Chronodot) which is set to UTC.
  • WorldClock: A self-adjusting clock for multiple time zones.
  • WriteRules: A sketch to write TimeChangeRules to EEPROM.
  • Change_TZ_1: Changes between time zones by modifying the TimeChangeRules.
  • Change_TZ_2: Changes between time zones by selecting from an array of Timezone objects.

Functionality

To use the Time library in an Arduino sketch, include TimeLib.h.

#include <TimeLib.h>

The functions available in the library include

hour();            // the hour now  (0-23)
minute();          // the minute now (0-59)
second();          // the second now (0-59)
day();             // the day now (1-31)
weekday();         // day of the week (1-7), Sunday is day 1
month();           // the month now (1-12)
year();            // the full four digit year: (2009, 2010 etc)

there are also functions to return the hour in 12-hour format

hourFormat12();    // the hour now in 12 hour format
isAM();            // returns true if time now is AM
isPM();            // returns true if time now is PM

now();             // returns the current time as seconds since Jan 1 1970

The time and date functions can take an optional parameter for the time. This prevents
errors if the time rolls over between elements. For example, if a new minute begins
between getting the minute and second, the values will be inconsistent. Using the
following functions eliminates this problem

time_t t = now(); // store the current time in time variable t
hour(t);          // returns the hour for the given time t
minute(t);        // returns the minute for the given time t
second(t);        // returns the second for the given time t
day(t);           // the day for the given time t
weekday(t);       // day of the week for the given time t
month(t);         // the month for the given time t
year(t);          // the year for the given time t

Functions for managing the timer services are:

setTime(t);                      // set the system time to the give time t
setTime(hr,min,sec,day,mnth,yr); // alternative to above, yr is 2 or 4 digit yr
                                 // (2010 or 10 sets year to 2010)
adjustTime(adjustment);          // adjust system time by adding the adjustment value
timeStatus();                    // indicates if time has been set and recently synchronized
                                 // returns one of the following enumerations:
timeNotSet                       // the time has never been set, the clock started on Jan 1, 1970
timeNeedsSync                    // the time had been set but a sync attempt did not succeed
timeSet                          // the time is set and is synced

Time and Date values are not valid if the status is . Otherwise, values can be used but
the returned time may have drifted if the status is .

setSyncProvider(getTimeFunction);  // set the external time provider
setSyncInterval(interval);         // set the number of seconds between re-sync

There are many convenience macros in the file for time constants and conversion
of time units.

To use the library, copy the download to the Library directory.

Library Functions

Following are the functions defined in the header time.h −

Sr.No. Function & Description
1 char *asctime(const struct tm *timeptr)

Returns a pointer to a string which represents the day and time of the structure timeptr.

2 clock_t clock(void)

Returns the processor clock time used since the beginning of an implementation defined era (normally the beginning of the program).

3 char *ctime(const time_t *timer)

Returns a string representing the localtime based on the argument timer.

4 double difftime(time_t time1, time_t time2)

Returns the difference of seconds between time1 and time2 (time1-time2).

5 struct tm *gmtime(const time_t *timer)

The value of timer is broken up into the structure tm and expressed in Coordinated Universal Time (UTC) also known as Greenwich Mean Time (GMT).

6 struct tm *localtime(const time_t *timer)

The value of timer is broken up into the structure tm and expressed in the local time zone.

7 time_t mktime(struct tm *timeptr)

Converts the structure pointed to by timeptr into a time_t value according to the local time zone.

8 size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)

Formats the time represented in the structure timeptr according to the formatting rules defined in format and stored into str.

9 time_t time(time_t *timer)

Calculates the current calender time and encodes it into time_t format.

Previous Page
Print Page

Next Page  

Library Variables

Following are the variable types defined in the header time.h −

Sr.No. Variable & Description
1

size_t

This is the unsigned integral type and is the result of the sizeof keyword.

2

clock_t

This is a type suitable for storing the processor time.

3

time_t is

This is a type suitable for storing the calendar time.

4

struct tm

This is a structure used to hold the time and date.

The tm structure has the following definition −

struct tm {
   int tm_sec;         /* seconds,  range 0 to 59          */
   int tm_min;         /* minutes, range 0 to 59           */
   int tm_hour;        /* hours, range 0 to 23             */
   int tm_mday;        /* day of the month, range 1 to 31  */
   int tm_mon;         /* month, range 0 to 11             */
   int tm_year;        /* The number of years since 1900   */
   int tm_wday;        /* day of the week, range 0 to 6    */
   int tm_yday;        /* day in the year, range 0 to 365  */
   int tm_isdst;       /* daylight saving time             */
};

SYNOPSIS top

       #include <time.h>

       char *asctime(const struct tm *tm);
       char *asctime_r(const struct tm *tm, char *buf);

       char *ctime(const time_t *timep);
       char *ctime_r(const time_t *timep, char *buf);

       struct tm *gmtime(const time_t *timep);
       struct tm *gmtime_r(const time_t *timep, struct tm *result);

       struct tm *localtime(const time_t *timep);
       struct tm *localtime_r(const time_t *timep, struct tm *result);

       time_t mktime(struct tm *tm);

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       asctime_r(), ctime_r(), gmtime_r(), localtime_r():
              _POSIX_C_SOURCE
                  || /* Glibc versions <= 2.19: */ _BSD_SOURCE ||
              _SVID_SOURCE

Clock ID Constants¶

These constants are used as parameters for and
.

Identical to , except it also includes any time that
the system is suspended.

This allows applications to get a suspend-aware monotonic clock without
having to deal with the complications of , which may
have discontinuities if the time is changed using or
similar.

: Linux 2.6.39 or later.

New in version 3.7.

The Solaris OS has a timer that attempts to use an optimal
hardware source, and may give close to nanosecond resolution.
is the nonadjustable, high-resolution clock.

: Solaris.

New in version 3.3.

Clock that cannot be set and represents monotonic time since some unspecified
starting point.

: Unix.

New in version 3.3.

Similar to , but provides access to a raw
hardware-based time that is not subject to NTP adjustments.

: Linux 2.6.28 and newer, macOS 10.12 and newer.

New in version 3.3.

High-resolution per-process timer from the CPU.

: Unix.

New in version 3.3.

High-resolution per-process timer from the CPU.

: FreeBSD, NetBSD 7 or later, OpenBSD.

New in version 3.7.

Thread-specific CPU-time clock.

: Unix.

New in version 3.3.

Time whose absolute value is the time the system has been running and not
suspended, providing accurate uptime measurement, both absolute and
interval.

: FreeBSD, OpenBSD 5.5 or later.

New in version 3.7.

Clock that increments monotonically, tracking the time since an arbitrary
point, unaffected by frequency or time adjustments and not incremented while
the system is asleep.

: macOS 10.12 and newer.

New in version 3.8.

The following constant is the only parameter that can be sent to
.

clock_gettme( )

На большинстве POSIX-совместимых ОС, (смотри мануалы к AIX, BSD, HP-UX, Linux и ) предоставляет самое точное значение процессорного времени. Первый аргумент функции выбирает «clock id», а второй это структура , заполняемая использованным процессорным временем в секундах и наносекундах. Для большинства ОС, программа должна быть слинкована с librt.

Однако, есть несколько тонкостей, затрудняющих использование этой функции в кросс-платформенном коде:

  • Функция является опциональной частью стандарта POSIX и доступна только если определен в значением больше 0. На сегодняшний день, AIX, BSD, HP-UX, Linux и Solaris поддерживают эту функцию, но OSX не поддерживает.
  • Структура , заполняемая функцией может хранить время в наносекундах, но точность часов отличается в разных ОС и на разных системах. Функция clock_getres( ) возвращает точность часов, если она вам нужна. Эта функция, опять-таки, является опциональной частью стандарта POSIX, доступной только если больше нуля. На данный момент, AIX, BSD, HP-UX, Linux и Solaris предоставляют эту функцию, но в Solaris она не работает.
  • стандарт POSIX определяет имена нескольких стандартных значений «clock id», включая , чтобы получить процессорное время процесса. Тем не менее, сегодня BSD и HP-UX не имеют этого id, и взамен определяют собственный id для процессорного времени. Чтобы запутать все ещё больше, Solaris определяет оба этих, но использует для процессорного времени потока, а не процесса.
ОС Какой id использовать
AIX
BSD
HP-UX
Linux
Solaris
  • Вместо того, чтобы использовать одну из констант, объявленных выше, функция clock_getcpuclockid( ) возвращает таймер для выбранного процесса. Использование процесса 0 позволяет получить процессорное время текущего процесса. Однако, это ещё одна опциональная часть стандарта POSIX и доступна только если больше 0. На сегодняшний день, только AIX и Linux предоставляют эту функцию, но линуксовские include-файлы не определяют и функция возвращает ненадёжные и несовместимые с POSIX результаты.
  • Функция может быть реализована с помощью регистра времени процессора. На многопроцессорных системах, у отдельных процессоров может быть несколько разное восприятие времени, из-за чего функция может возвращать неверные значения, если процесс передавался от процессора процессору. На Linux, и только на Linux, это может быть обнаружено, если возвращает не-POSIX ошибку и устанавливает в . Однако, как замечено выше, на Linux ненадежен.

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

Доступность clock_gettime( ): AIX, BSD, Cygwin, HP-UX, Linux и Solaris. Но clock id на BSD и HP-UX нестандартные.

Доступность clock_getres( ): AIX, BSD, Cygwin, HP-UX и Linux, но не работает Solaris.

Доступность clock_getcpuclockid( ): AIX и Cygwin, не недостоверна на Linux.

Получение процессорного времени:

DESCRIPTION top

       The functions gettimeofday() and settimeofday() can get and set the
       time as well as a timezone.

       The tv argument is a struct timeval (as specified in <sys/time.h>):

           struct timeval {
               time_t      tv_sec;     /* seconds */
               suseconds_t tv_usec;    /* microseconds */
           };

       and gives the number of seconds and microseconds since the Epoch (see
       time(2)).

       The tz argument is a struct timezone:

           struct timezone {
               int tz_minuteswest;     /* minutes west of Greenwich */
               int tz_dsttime;         /* type of DST correction */
           };

       If either tv or tz is NULL, the corresponding structure is not set or
       returned.  (However, compilation warnings will result if tv is NULL.)

       The use of the timezone structure is obsolete; the tz argument should
       normally be specified as NULL.  (See NOTES below.)

       Under Linux, there are some peculiar "warp clock" semantics associ‐
       ated with the settimeofday() system call if on the very first call
       (after booting) that has a non-NULL tz argument, the tv argument is
       NULL and the tz_minuteswest field is nonzero.  (The tz_dsttime field
       should be zero for this case.)  In such a case it is assumed that the
       CMOS clock is on local time, and that it has to be incremented by
       this amount to get UTC system time.  No doubt it is a bad idea to use
       this feature.

Функции времени (time.h)

Эта глава посвящен функциям работы со временем (прошедшем,
текущим или вычисленным) и для вычислений, использующих время.

Файл time.h определяет три типа: clock_t и time_t оба служат
для представления времени в удобном для произведения арифметических
операций виде (В этой реализации величины типа clock_t имеют наивысшую
точность, воэможную для данного компьютера, а точность величин типа
time_t составляет одну секунду.), тип size_t определен для
представления размеров.

В time.h также определяется структура tm для стандартного
представления времени по грегорианскому календарю как цепочки чисел со
следующими полями:

tm_sec

Секунды.

tm_min

Минуты.

tm_hour

Часы.

tm_mday

День.

tm_mon

Месяц.

tm_year

Год (с 1900).

tm_wday

День недели: число дней с воскpесенья.

tm_yday

Число дней, пpошедших с пеpвого янваpя.

tm_isdst

Флаг летнего вpемени: положительное значение означает, что
действyет летнее вpемя, нyлевое — что оно не действyет,
отpицательное — что данных об этом нет.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *