繁体   English   中英

Time.h在C语言中提供错误答案

[英]Time.h Providing Incorrect Answer in C

我有一个日期数组,当前是{2010、5、13、2010、5、15}等格式的整数。 我正在尝试使用time.h库来查找每个日期之间的天数差异。 以下代码描述了问题所在:

int main()
{
    int dates[] = {2010, 4, 14, 2010, 4, 15, 2010, 4, 16};
    int* pDates = dates;
    printf("%d\n", subtractDates(1, pDates));
    return 0;
}

int subtractDates(int i, int* pDates)
{
  struct tm start_date;
  struct tm end_date;
  time_t start_time, end_time;

  start_date.tm_hour = 0;  
  start_date.tm_min = 0;  
  start_date.tm_sec = 0;
  start_date.tm_mon = *(pDates+1)-1; 
  start_date.tm_mday = *(pDates+2); 
  start_date.tm_year = *(pDates)-1900;

  end_date.tm_hour = 0;  
  end_date.tm_min = 0;  
  end_date.tm_sec = 0;
  end_date.tm_mon = *(pDates+1+i*3)-1; 
  end_date.tm_mday = *(pDates+2+i*3); 
  end_date.tm_year = *(pDates+i*3)-1900;
  start_time = mktime(&start_date);
  end_time = mktime(&end_date);

  return difftime(end_time, start_time) / 86400;
}

此代码打印出来的日期之间的差是1天,这是正确的。 但是,如果我删除数组中的第三个日期,如下所示,则打印值将变为0,我认为这是不正确的。

int main()
{
    int dates[] = {2010, 4, 14, 2010, 4, 15};
    int* pDates = dates;
    printf("%d\n", subtractDates(1, pDates));
    return 0;
}

int subtractDates(int i, int* pDates)
{
  struct tm start_date;
  struct tm end_date;
  time_t start_time, end_time;

  start_date.tm_hour = 0;  
  start_date.tm_min = 0;  
  start_date.tm_sec = 0;
  start_date.tm_mon = *(pDates+1)-1; 
  start_date.tm_mday = *(pDates+2); 
  start_date.tm_year = *(pDates)-1900;

  end_date.tm_hour = 0;  
  end_date.tm_min = 0;  
  end_date.tm_sec = 0;
  end_date.tm_mon = *(pDates+1+i*3)-1; 
  end_date.tm_mday = *(pDates+2+i*3); 
  end_date.tm_year = *(pDates+i*3)-1900;
  start_time = mktime(&start_date);
  end_time = mktime(&end_date);

  return difftime(end_time, start_time) / 86400;
}

考虑到我所做的就是删除数组中的三个值,而我在第一个程序中甚至没有使用这三个值,我只是不明白为什么它返回0。 任何帮助,将不胜感激,谢谢。

我遇到的问题是我正在分配和返回双精度整数。 通过仅对此进行修改,我就能使我的代码生效。 感谢所有提供帮助的人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM