Преобразовать время (UTC) в виде строки в местное время

У меня есть строка времени, например, «132233» («Время только без даты»), и я хочу преобразовать ее в местное время.
Итак, чтобы использовать функцию localtime (), я сначала преобразовал свою строку в time_t, используя mktime () (спасибо Как преобразовать строковую переменную, содержащую время, в тип time_t в c ++? ), а затем напечатали время после преобразования, используя strftime, как показано в (http://www.cplusplus.com/reference/ctime/strftime/)
Я получаю серьезную ошибку во время выполнения. Может кто-нибудь, пожалуйста, скажите мне, что не так. заранее спасибо

int main()
{
string time_sample="132233";

std::string s_hrs (time_sample.begin(), time_sample.begin()+2);
std::string s_mins (time_sample.begin()+2,time_sample.begin()+4);
std::string s_secs (time_sample.begin()+4,time_sample.begin()+6);

int hrs = atoi(s_hrs.c_str());
int mins = atoi(s_mins.c_str());
int secs = atoi(s_secs.c_str());

struct tm time_sample_struct = {0};
time_sample_struct.tm_hour = hrs;
time_sample_struct.tm_min = mins;
time_sample_struct.tm_sec = secs;

time_t converted_time;
converted_time = mktime(&time_sample_struct);

struct tm * timeinfo;
char buffer[80];
timeinfo = localtime(&converted_time);
strftime(buffer,80,"%I:%M:%S",timeinfo);
puts(buffer);
cout<<endl;
getch();
return 0;
}

0

Решение

Ваша проблема в том, что если time_t является 32-битным значением, самая ранняя возможная дата, которую он может кодировать (учитывая эпоху 1970-1-1), — 1901-12-13.

Однако вы не устанавливаете поля даты вашего tm структура, что означает, что по умолчанию 0-0-0 который представляет 1900-1-0 (поскольку tm_day основывается на 1, у вас фактически неправильный день месяца).

Поскольку это не может быть представлено 32-битным time_t mktime функция не работает и возвращается -1, ситуация, которую вы не проверяете.

Простейшим решением является инициализация полей даты tm структурировать что-то time_t может представлять:

time_sample_struct.tm_year = 114;
time_sample_struct.tm_mday = 1;
0

Другие решения


По вопросам рекламы [email protected]