Преобразовать строку времени с DST в метку времени UTC - PullRequest
1 голос
/ 23 июня 2019

Я пытаюсь преобразовать удобочитаемую строку времени, которая была установлена ​​для определенного часового пояса с DST (например, Тегеран + 4.30 / 3.30), в метку времени UTC.Я использую платформу ARM mbed-os на устройстве STM, в котором отсутствуют некоторые функции времени C, такие как strptime.

В любом случае, я преобразовал строку времени в метку времени, ноЯ не могу понять, как изменить его на UTC.Строковое время установлено для определенного часового пояса, который имеет летнее время, поэтому я не могу просто добавить / удалить разрыв часового пояса.

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

time_t current_time(void)
{
    time_t epoch = 0;
    parser.send("AT+CCLK?");
    string resp = read_until("OK\r\n");
    //result would be something like this:
    /*
    +CCLK: "19/06/23,19:33:42+18"

    OK

    */
    // extract time string
    unsigned int pos = resp.find("+CCLK: \"");
    unsigned int pos2 = resp.rfind("\"\r\n");
    if ((pos != string::npos) && (pos2 != string::npos))
    {
        string time_str = resp.substr(pos + 8, pos2 - pos - 11);

        //convert to timestamp
        int hh, mm, ss, yy, mon, day;
        struct tm when = {0};

        sscanf(time_str.c_str(), "%d/%d/%d,%d:%d:%d", &yy, &mon, &day, &hh, &mm, &ss);
        when.tm_hour = hh;
        when.tm_min = mm;
        when.tm_sec = ss;
        when.tm_year = 2000 + yy - 1900;
        when.tm_mon = mon - 1;
        when.tm_mday = day;
        epoch = mktime(&when);

        // below doesn't work all time because we have DST
        // add 3.30 (+1.00 daylight) offset to get UTC
        epoch = epoch - (time_t)((4 * 3600) + (30 * 60));
    }
    return epoch;
}

1 Ответ

0 голосов
/ 23 июня 2019

Попробуйте:

when.tm_isdst = -1;

до вызова mktime и удаления корректировки смещения epoch UTC.

...