简单的c++时间程序错误

simple c++ time program error

本文关键字:程序 错误 时间 c++ 简单      更新时间:2023-10-16

我在处理时间头,遇到了一个错误:

invalid conversion from 'tm*' to 'time_t'

当我尝试使用difftime函数时,您可以在下面的代码底部看到错误所在的位置。我知道我只是在做一些愚蠢和违法的事情,但我不知道我该怎么做。如果有人有解决方案,请告诉我。谢谢

该程序应该得到当前时间,从用户那里输入时间,然后找到时间差。

代码:

#include <stdio.h>
#include <time.h>
int main ()
{
  time_t rawtime;
  struct tm * timeinfo;
  struct tm * cur_timeinfo_hold;
  int year, month ,day,hour,minute,second;
  double dif;
  /* prompt user for time to be compared*/
  printf ("Enter year: "); scanf ("%d",&year);
  printf ("Enter month: "); scanf ("%d",&month);
  printf ("Enter day: "); scanf ("%d",&day);
  printf ("Enter hour: "); scanf ("%d",&hour);
  printf ("Enter minute: "); scanf ("%d",&minute);
  printf ("Enter second: "); scanf ("%d",&second);
  /* get current timeinfo*/
  time ( &rawtime );
  timeinfo = localtime ( &rawtime );
  /* print it */
  printf("The present time is: "); printf(asctime (timeinfo));
 /* set current time into a new variable to use for difftime, since timeinfo, will be changed */
  cur_timeinfo_hold = timeinfo;
  /* modify current timeinfo to the user's choice */
  timeinfo->tm_year = year - 1900;
  timeinfo->tm_mon = month - 1;
  timeinfo->tm_mday = day;
  timeinfo->tm_hour = hour;
  timeinfo->tm_min = minute;
  timeinfo->tm_sec = second;
  mktime ( timeinfo );
  /* and print it */
  printf ("time to compare: "); printf(asctime (timeinfo));
  /* find time difference */
 //dif = difftime (cur_timeinfo_hold,timeinfo); //error: invalid conversion from 'tm*' to 'time_t'
  return 0;
}

mktime是一个函数。它接受一个参数tm指针,并返回一个值time_t。它不会将参数从一种类型转换为另一种类型。因此,在调用mktime(timeinfo)之后,timeinfo变量仍然是tm指针。

difftime函数期望接收两个time_t值,因此它不会接受cur_timeinfo_holdtimeinfo;他们是错误的类型。第一个变量的值来自于将rawtime转换为具有localtimetm指针,因此将其用于第一个参数。当您稍后调用mktime(timeinfo)时,它返回了一个time_t值,但您忽略了返回值。将返回值分配给一个变量,以便将其用于第二个difftime参数。

time_t info = mktime(timeinfo);
// ...
dif = difftime(rawtime, info);
这是因为difftime需要原始的time_t值,而不是struct tm结构。

原型是:

double difftime(time_t time1, time_t time0);

您需要做的是保持系统时间不变(不执行localtime),然后使用mktime将用户输入的信息正确地转换为等效的time_t(如果使用UTC时间,则为timegm)。

然后您可以使用difftime来获得差异。实际上,类似于:

time_t base, other;
struct tm tms;
double delta;
time (&base);                    // basetime is now.
tms.blah = blah;                 // for all blahs.
other = mktime (&tms);           // get time_t for other time. 
delta = difftime (other, base);  // get difference.