【问题标题】:difference of two user entered time c++两个用户输入时间的差异c ++
【发布时间】:2016-08-16 20:27:51
【问题描述】:

我需要能够填充两个变量(一种时间变量),然后能够计算它们的差异。 经过我所有的搜索后,我找到了difftime,但我的问题是,它使用time_t 变量,我不知道如何用我想要的时间填充“time_t”。 例如,我想用户输入 time_1 和 time_2 作为 (10:04, 11:05),它能够以秒或分钟或小时或任何时间显示差异。(例如 61 分钟)

我试过了,但没有成功:

#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 输出,这不是真的,它应该是 3660(difftime 显示秒)
  • 两个mktime 调用都返回-1,表示失败。 difftime(-1, -1) 为零也就不足为奇了。
  • @JonnyHenly 我的代码也像你的一样在 cpp.sh 中工作,但它们都不能在 VB 中工作

标签: c++ time ctime time-t difftime


【解决方案1】:

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};

在阅读用户输入之前。

更新

使用

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

初始化time_1time_2 似乎对我有用。

http://ideone.com/AmCzTu查看它。

【讨论】:

  • 我想你只需要初始化tm_hourtm_mintm_sectm_montm_mdayExample。 +1 比抱歉更安全。
  • tm time_1 = {0}; 是一个完整的初始化,但不是一个有效的初始化。尽管您不会有未定义的行为,mktime() 将由于无效输入而中止。当mktime() 失败时,它返回-1,OP 观察到两个-1 之间的差异为零。
  • @BenVoigt 在我测试时看到 mktime 返回 -1,这是怎么回事,我该怎么办?
  • @DanialRazavi:确保所有字段都在 R Sahu 描述的合法范围内。特别要注意tm_mday 的范围是 1-31,不能为零。
  • @BenVoigt 我检查了,我用 tm time_1 = {0, 0, 0, 1, 0, 0, 0, 0, 0} 进行了双重检查;也是,但没有修复。
猜你喜欢
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多