Является ли time_t возвращаемым для часового пояса? - PullRequest
7 голосов
/ 15 сентября 2011

Я новичок в <time.h> и у меня вопрос по time_t и time().

Я прочитал функцию time (), задокументированную следующим образом:

time_t time (time_t * timer); Получить текущее время

Получить текущее календарное время как объект time_t.

Функция возвращает это значение, и если аргумент не является нулевым указатель, значение также устанавливается для объекта, на который указывает таймер.

В документации не говорится о часовом поясе.

Таким образом, для следующего кода C ++:

time_t t = время (NULL);

Если две машины, одна в США, а другая в Великобритании, одновременно выполнят вызов функции time(NULL), будут ли возвращенные объекты time_t идентичны?

Будет ли time () возвращать значение независимо от часового пояса?

Ответы [ 6 ]

8 голосов
/ 15 сентября 2011

Нет, это не зависит от зоны.Возвращает значение, которое подсчитывает количество секунд с 1 января 1970 года в UTC, игнорируя дополнительные секунды.Таким образом (в принципе), если две машины выполняют вызов в одно и то же время, возвращаемое значение будет одинаковым, даже если они работают в двух разных часовых поясах.

3 голосов
/ 15 сентября 2011

Что ж, задокументировано, что возвращается time_t - что задокументировано с:

Практически повсеместно ожидается, что оно будет целым значением, представляющим количество прошедших секундс 00:00 часов 1 января 1970 года по UTC.Это связано с историческими причинами, поскольку оно соответствует метке времени Unix, но широко применяется в библиотеках C на всех платформах.

Так что, строго говоря, это не гарантируется кроссплатформенностью по внешнему виду,но на практике можно обрабатывать кросс-платформенным способом и в UTC.

(Конечно, для time_t будет несколько источников документации, чтобы начать с ... Iя не уверен, что именно здесь можно считать окончательным.)

2 голосов
/ 15 сентября 2011

time_t значения не зависят от разницы часовых поясов, так как они отсчитывают время от эпохи .Если вы хотите иметь местное календарное время, вы можете взять это значение time_t и передать его функции localtime(), которая возвращает указатель на struct tm с вашим местным временем.

1 голос
/ 01 апреля 2015

В соответствии с последним стандартом языка программирования C, выпущенным в 2011 году:

1. The *time* function determines the current **calendar time**. 
2. The encoding of the value is unspecified.
3. The *time* function returns the implementation’s best approximation 
to the current calendar time.

, где календарное время в терминах стандарта represents the current date (according to the Gregorian calendar) and time в отличие от местного время , что the calendar time expressed for some specific time zone. А The range and precision of times representable in clock_t and time_t are implementation-defined.

В результате:

  1. значения time_t, возвращаемые time () из библиотеки C, не должны зависеть от часового пояса. Если это не так, реализация библиотеки C не соответствует стандарту, и эту ситуацию можно рассматривать как ошибку в библиотеке.
  2. кодировка значения time_t не указана! Это может быть указано в стандарте POSIX, но определенно не указано в стандарте C. В связи с этим вы не должны полагаться на предположения о деталях его реализации, такие как то, что он отсчитывает время с точностью до одной секунды или что это целое число, содержащее количество секунд, прошедших с 00:00 часов, 1 января 1970 года UTC. Вместо этого используйте соответствующие функции из стандартной библиотеки C, такие как gmtime () и localtime () , чтобы преобразовать time_t в struct tm и получить доступ к деталям отметки времени. По крайней мере, если ваше приложение не считается ограниченным только * системами NIX.
1 голос
/ 15 сентября 2011

Нет; эта функция возвращает второй отсчет с 00:00:00 UTC 1 января 1970 года.

Википедия

0 голосов
/ 27 февраля 2017

Это даст вам вашу "локальную эпоху":

time_t t = time(NULL);      
t = timegm(localtime(&t);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...