2016-04-23 4 views
1

Мне нужно заполнить две переменные (вид временной переменной), а затем уметь рассчитать их разницу. после всех моих поисков я нашел difftime, но моя проблема в том, что он использует переменные time_t, и я не знаю, как заполнить «time_t» со временем, которое я хочу. Например, я хочу, чтобы пользователь вводил time_1 и time_2 as (10:04, 11:05), и он может показывать разницу в секундах или минутах или в часе или что-то в этом роде (например, 61 мин)разница между двумя введенными пользователем данными C++

Я пробовал как удар, но он не работал:

#include <iostream> 
#include <ctime> 
using namespace std; 
void main() 
{ 
    tm time_1 = {0, 0, 0, 1, 0, 0, 0, 0, 0}; 
    tm time_2 = {0, 0, 0, 1, 0, 0, 0, 0, 0}; 

    time_1.tm_hour = 10; 
    time_1.tm_min = 4; 

    time_2.tm_hour = 11; 
    time_2.tm_min = 5; 

    double diff = difftime (mktime(&time_2),mktime(&time_1)); 

    cout << diff << endl; 

    system("pause"); 
} 
+0

* но это не сработало * - добавьте к вашему вопросу объяснение **, как это не работает **. Была ли ошибка? Получали ли вы неожиданный результат? –

+0

Я имею в виду, что он просто показывает 0 выход, что не так, должно быть 3660 (difftime показывает секунды) –

+0

Оба вызова 'mktime' возвращают' -1', что указывает на сбой. Неудивительно, что 'difftime (-1, -1)' равно нулю. –

ответ

2

std::tm имеет следующие элементы (http://en.cppreference.com/w/cpp/chrono/c/tm):

int tm_sec; // seconds after the minute – [0, 61](until C++11)/[0, 60] (since C++11) 
int tm_min; // minutes after the hour – [0, 59] 
int tm_hour; // hours since midnight – [0, 23] 
int tm_mday; // day of the month – [1, 31] 
int tm_mon; // months since January – [0, 11] 
int tm_year; // years since 1900 
int tm_wday; // days since Sunday – [0, 6] 
int tm_yday; // days since January 1 – [0, 365] 
int tm_isds; // Daylight Saving Time flag. 

Вы настроите только несколько из этих членов. Остальные неинициализированы для обоих объектов.

Следовательно, ваша программа имеет неопределенное поведение.

Чтобы увидеть предсказуемое поведение, правильно инициализируйте объекты. Один из способов:

tm time_1 = {0, 0, 0, 1, 0, 0, 0, 0, 0}; 
tm time_2 = {0, 0, 0, 1, 0, 0, 0, 0, 0}; 

перед тем, как читать ввод пользователя.

Update

Использование

std::time_t t = std::time(NULL); 
std::tm time_1 = *std::localtime(&t); 
tm time_2 = time_1; 

Для инициализации time_1 и time_2, кажется, работает для меня.

Просмотреть результаты работы http://ideone.com/AmCzTu.

+0

Мне кажется, вам просто нужно инициализировать 'tm_hour',' tm_min', 'tm_sec',' tm_mon' и 'tm_mday'. [Пример] (http://cpp.sh/3wti). +1 лучше безопасно, чем жаль. –

+0

'tm time_1 = {0};' является полной инициализацией, но недействительной. Хотя у вас не будет неопределенного поведения, 'mktime()' отменяет из-за неверных входов. Когда 'mktime()' терпит неудачу, он возвращает '-1', а разница между двумя' -1' равна нулю, как это наблюдается OP. –

+0

@BenVoigt, хороший пункт. Обновлен ответ. –

Смежные вопросы