Проблема здесь в том, что time_t
должно представлять количество секунд (упрощение, см. Сноску) с начала эпохи.Это не зависит от часовых поясов.Если вы добавите смещение часового пояса к time_t
, ни одна из функций не будет работать должным образом.Часть проблемы заключается в том, что иногда невозможно узнать, как правильно преобразовать такое значение в метку времени POSIX - когда часы возвращаются осенью, где я живу, часы будут читать 1:30 утра дважды в течение одного дняи без дополнительной информации вы не можете выяснить, какое время UTC.
Вам нужно будет преобразовать в местное календарное время, прежде чем вы сможете преобразовать в метку времени POSIX, после чего вы можете преобразовать в UTCкалендарное время.
// NOTE: not reentrant
time_t local_to_posix(time_t t) {
struct tm *tm;
time_t tt;
tm = gmtime(&t); // No timezone compensation
tm->tm_isdst = -1; // Let mktime figure out daylight savings
// NOTE: this WILL be wrong for one hour each year
tt = mktime(tm); // Converts local time to POSIX timestamp
return tt;
}
Затем вы можете передать результат в gmtime
, что даст вам календарное время по UTC.метки времени не являются UTC и не измеряют количество секунд с начала эпохи.Это временные метки POSIX, которые отсчитывают секунды с начала эпохи, как если бы не было високосных секунд.Это, вероятно, не имеет значения, если ваши часы реального времени не являются атомными.