UTC время из отметки времени - PullRequest
2 голосов
/ 23 июля 2011

Я пытаюсь получить время UTC по местному времени. Наоборот все работает нормально. У меня проблемы только тогда, когда я хочу преобразовать местное время в UTC, чтобы обновить часы RTC. Вот что я делаю:

Скажите, что t является локальной меткой времени.

char *tz = "GMT-2GMT,M3.5.0/3,M10.5.0/4";

t = 1311444000;  // 23/07/11 18:00:00

set_TZ(tz);

gmt_time = gmtime(&t);
mktime(gmt_time);
printf("GMT Time: %s\r\n",asctime (gmt_time));

Это дает мне 18:00:00, когда это должно быть минус часовой пояс.

Как мне решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 23 июля 2011

Проблема здесь в том, что 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, которые отсчитывают секунды с начала эпохи, как если бы не было високосных секунд.Это, вероятно, не имеет значения, если ваши часы реального времени не являются атомными.

0 голосов
/ 24 июля 2011

После дальнейших тестов следующий код, кажется, работает. Я в UTC + 2 и в настоящее время в летнее время. Возвращенное время для UTC является правильным. Я буду дальше тестировать без DST и посмотреть, что возвращается.

struct tm tm;
struct tm *local_time;
char *tz = "GMT-2GMT,M3.5.0/3,M10.5.0/4";
time_t t;

tm.tm_hour = 18;
tm.tm_min = 0;
tm.tm_sec = 0;

tm.tm_wday = 0;
tm.tm_yday = 0;

tm.tm_year = (2011) - 1900;
tm.tm_mday = 22;
tm.tm_mon = 7 - 1;
tm.tm_isdst = -1;

set_TZ(tz);

t = mktime(&tm);
local_time = localtime(&t);
printf("Local Time: %s\r\n",asctime (local_time ));
local_time = gmtime(&t);
printf("UTC Time: %s\r\n",asctime (local_time ));

Выход:

Local Time: Fri Jul 22 18:00:00 2011
UTC Time: Fri Jul 22 15:00:00 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...