【问题标题】:Trying to calculate difference between two dates using time.h library尝试使用 time.h 库计算两个日期之间的差异
【发布时间】:2015-03-18 21:18:07
【问题描述】:

我正在尝试使用我自己的 Date 结构计算我给出的两个日期之间的确切差异,我现在正在测试返回差异的函数:

Date dateDifference(Date a, Date b){
    time_t rawtime,timeA,timeB;
    struct tm* tA,*tB;
    double difference;

    time(&rawtime);
    tA = tB = localtime(&rawtime);

    tA->tm_mday = 20;
    tA->tm_mon = 1;
    tA->tm_year = 115;

    tB->tm_mday = 3;
    tB->tm_mon = 10;
    tB->tm_year = 89;

    timeA = mktime(tA);
    timeB = mktime(tB);

    difference = difftime(timeA, timeB);
}

如您所见,我在两个“tm”结构中提供了一些手动数字来测试它。 当我调试时,我在“timeA”和“timeB”中得到完全相同的值。 我不太熟悉 time.h 函数,因此我正在使用我在网络上找到的知识来做这件事,这是我成功实现的最好成绩。

我做错了什么?

【问题讨论】:

    标签: c++ c time time.h


    【解决方案1】:

    有人可能会认为,这是由

    引起的
    tA = tB = localtime(&rawtime);
    

    然而,这只是事实的一半,因为把它分成

    tA = localtime(&rawtime);
    tB = localtime(&rawtime);
    

    还导致tAtB 都指向同一个地址。这在manpage of localtime (man 3 localtime) 中有说明:“返回值指向一个静态分配的字符串,后续调用任何日期和时间函数可能会覆盖该字符串。”

    因此,您必须将两者之一复制到新分配的struct tm

    【讨论】:

      【解决方案2】:

      tAtB 都应该使用 struct tm 而不是 struct tm * 中的指针。这样他们每个人都有自己的记忆来操纵。

      原始代码使用指向同一内存位置的指针。所以改变一个也改变了另一个。

      Date dateDifference(Date a, Date b){
          time_t rawtime,timeA,timeB;
          // struct tm* tA,*tB;
          struct tm tA, tB;
          double difference;
      
          time(&rawtime);
          // tA = tB = localtime(&rawtime);
          tA = tB = *localtime(&rawtime);
      
          tA.tm_mday = 20;
          tA.tm_mon = 1;
          tA.tm_year = 115;
      
          tB.tm_mday = 3;
          tB.tm_mon = 10;
          tB.tm_year = 89;
      
          timeA = mktime(&tA);
          timeB = mktime(&tB);
      
          difference = difftime(timeA, timeB);
          ...
      }
      

      代码可能还有另一个微妙的问题。假设下面是今天,有一个 off-by-1 错误

          tA.tm_mday = 20;
          // tA.tm_mon = 1;
          tA.tm_mon = 1 - 1;  // months since January
          tA.tm_year = 115;   // years since 1900
      

      【讨论】:

        【解决方案3】:

        你遇到的两个问题是:

        localtime() 返回一个指向它自己的静态内存中的结构的指针。您应该在再次调用localtime() 之前复制该结构。

        您没有为两个 tm 结构分配任何内存 - 我已将它们从指针更改为简单结构。

        #include <stdio.h>
        #include <time.h>
        
        int main()
        {
            time_t timeA, timeB;
            struct tm tA, tB, *tptr;
            double difference;
        
            time(&timeA);
            time(&timeB);
            tptr = localtime(&timeA);
            tA = *tptr;
            tptr = localtime(&timeB);
            tB = *tptr;
        
            tA.tm_mday = 20;
            tA.tm_mon = 1;
            tA.tm_year = 115;
        
            tB.tm_mday = 3;
            tB.tm_mon = 10;
            tB.tm_year = 89;
        
            timeA = mktime(&tA);
            timeB = mktime(&tB);
        
            difference = difftime(timeA, timeB);
            printf ("Difference is %.0f seconds\n", difference);
            return 0;
        }
        

        程序输出:

        Difference is 798336000 seconds
        

        【讨论】:

          猜你喜欢
          • 2013-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-01
          • 1970-01-01
          • 2021-11-25
          相关资源
          最近更新 更多