std :: mktime возвращает -1 в QNX - PullRequest
3 голосов
/ 03 июля 2019

C ++ 11

Имеет кроссплатформенный код с использованием std :: mktime в Ununtu 18 (x64) и QNX (x64)

В Ubuntu все в порядке.Но на QNX mktime возвращает -1.errno = 3 Что не так?

#include <iostream>
#include "ctime"


int main(int argc, char *argv[]){

    const std::string token = "100901";

    std::string dd = token.substr( 0, 2 );
    std::string mm = token.substr( 2, 2 );
    std::string yy = token.substr( 4, 2 );

    struct std::tm date_tm = {};

    date_tm.tm_mday = std::stoi( dd);
    date_tm.tm_mon = std::stoi( mm) - 1;
    date_tm.tm_year = std::stoi( yy) + 100;

    if (std::mktime( &date_tm ) == -1);
    {
        std::cout << "Error";
    }

    return 0;
}

PS Пробовал init struct tm как:

struct std::tm date_tm = {0};

std::memset( &date_tm, 0, sizeof( date_tm ) )

Некоторые примечания:

1) если я звоню mktime дважды - все будет хорошо (получит время)

2) тм структура печати

tm_gmtoff: 0
tm_hour: 0
tm_isdst: 0
tm_mday: 10
tm_min: 0
tm_mon: 8
tm_sec: 0
tm_wday: 0
tm_yday: 0
tm_year: 101

Существуют ли другие (простые и быстрые) способыполучить время в секундах для моего случая?

1 Ответ

0 голосов
/ 05 июля 2019

На устройстве QNX эта проблема была исправлена ​​установкой tm structure tm_isdst = 1 и tm_zone (GMT)

К сожалению, это сломало мою сборку Ubuntu (из-за часового пояса на моем локальном ПК это был EET).

Заменено получение секунд на boost :: poxis_time

    struct tm date_tm;
    std::memset( &date_tm, 0, sizeof( date_tm ) );
    strptime(token.c_str(), "%d%m%y", &date_tm);

    boost::posix_time::time_duration diff
        = boost::posix_time::ptime( boost::gregorian::date_from_tm( date_tm ) )
          - boost::posix_time::ptime( boost::gregorian::date( 1970, 1, 1 ) );

    date = diff.ticks( ) / boost::posix_time::time_duration::rep_type::ticks_per_second;

...