У меня есть две метки времени, хранящиеся в виде строковых переменных. Метки времени имеют формат дд / мм / гггг-чч: мм: сс
Я пытаюсь найти разницу в секундах между двумя временными метками (игнорируя даты).
(Я не назначил строки a и b, но каждая из них содержит временную метку)
Он всегда выводит 0 для разницы в количестве секунд, и я не могу понять, почему.
std::string a, b; // hold timestamps
struct tm t, t1;
double seconds;
t.tm_hour = stoi(a.substr(11,2)); // stoi() cast substring to int
t.tm_min = stoi(a.substr(14,2));
t.tm_sec = stoi(a.substr(17,2));
t1.tm_hour = stoi(b.substr(11,2));
t1.tm_min = stoi(b.substr(14,2));
t1.tm_sec = stoi(b.substr(17,2));
seconds = difftime(mktime(&t1), mktime(&t));
std::cout<<seconds;
Добавьте следующий код после определений и перед присвоениями
// initialize time structures with all the details for 'now'
time_t ts;
time( &ts );
t = * localtime( &ts );
t1 = t;
Не используйте жестко заданные значения подстрок (1 минута против 11 минут может заставить вас отключиться, если нотация 01 не используется … и у вас есть также месяцы, дни и часы, которые следует учитывать).
Вместо того, чтобы жестко задавать смещение, попробуйте перейти к уникальным символам (чтобы получить «секунды», учитывайте единственную строку после 2-го вхождения «:»).
Я предлагаю использовать CTime для работы с меткой времени.
http://www.cplusplus.com/reference/ctime/
Вы можете использовать это для хранения и позже, если вам нужно, преобразовать в строку.
Это было бы отличной причиной, чтобы начать с Увеличение библиотеки, потому что Boost.Date_Time имеет именно то, что вам нужно. Смотрите документацию о продолжительность времени.
Вот пример программы:
#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>
int main()
{
boost::posix_time::time_duration duration1 = boost::posix_time::duration_from_string("10:11:12");
boost::posix_time::time_duration duration2 = boost::posix_time::duration_from_string("10:12:15");
std::cout << (duration2 - duration1).total_seconds() << "\n";
}
Выход: 63
Поскольку вы уже используете substr
а также std::stoi
, вам должно быть легко получить правильные подстроки из a
а также b
быть переданным boost::posix_time::duration_from_string
,