代码之家  ›  专栏  ›  技术社区  ›  Vinayak Deshmukh

C中的两个不同时间

  •  2
  • Vinayak Deshmukh  · 技术社区  · 1 年前

    我正在尝试用C编写一个程序,以两个时区显示当前时间:Greenich平均时间和印度标准时间。印度标准时间比格林尼治标准时间早5小时30分钟,相当于19800秒。 我的代码是。。。。。

    #include <stdio.h>
    #include <time.h>
    int main()
    
    {
        time_t gmt, ist; // gmt for Greenich Mean Time and ist for Indian Standard Time
        struct tm *gmt_tmp, *ist_tmp;
        char sgmt [100], sist [100];
        
        time (&gmt);
        ist = gmt + 19800; // to account for 5hr 30min time difference
        printf("gmt = %ld\n",gmt);
        printf("ist = %ld\n",ist);
        
        gmt_tmp = localtime (&gmt);
        ist_tmp = localtime (&ist);
        
        printf("gmt hour = %d\n",gmt_tmp->tm_hour);
        printf("ist hour = %d\n",ist_tmp->tm_hour);
        
        strftime (sgmt, 99, "%A, %d %B %Y, %X", gmt_tmp);
        strftime (sist, 99, "%A, %d %B %Y, %X", ist_tmp);
        
        printf("Current Greenwich Mean Time:       %s\n", sgmt);
        printf("Current Indian Standard Time:      %s\n", sist);
    
        return 0;
    }
    

    输出为:

    gmt = 1735909933
    ist = 1735929733
    gmt hour = 18
    ist hour = 18
    Current Greenwich Mean Time:       Friday, 03 January 2025, 18:42:13
    Current Indian Standard Time:      Friday, 03 January 2025, 18:42:13
    

    输出显示了GMT和IST的印度时间。我不明白为什么在计算IST变量时GMT变量会被覆盖。我错过了什么吗? 我该如何纠正这一点?

    2 回复  |  直到 1 年前
        1
  •  2
  •   dbush    1 年前

    这个 localtime 函数返回一个指向静态数据的指针。因此,当您调用它两次时,它将返回相同的指针值,第二次调用的结果将覆盖第一次调用的效果。

    你应该改用 localtime_r ,它接受类型为的附加参数 struct tm * 在那里存储结果。

    struct tm gmt_tmp, ist_tmp;
    ...
    localtime_r(&gmt, &gmt_tmp);
    localtime_r(&ist, &ist_tmp);
    ...
    strftime (sgmt, 99, "%A, %d %B %Y, %X", &gmt_tmp);
    strftime (sist, 99, "%A, %d %B %Y, %X", &ist_tmp);
    
        2
  •  1
  •   Hugo    1 年前

    当您为IST调用localtime时,它会覆盖GMT的localtime结果。

    使用gmtime表示GMT以避免时区问题。 将gmtime和localtime的结果复制到单独的struct tm变量中,以防止覆盖。

    #include <stdio.h>
    #include <time.h>
    
    int main() {
        time_t gmt, ist;
        struct tm gmt_tm, ist_tm; // Separate instances
        char sgmt[100], sist[100];
    
        time(&gmt);
        ist = gmt + 19800; // IST is 5h 30m ahead
    
        gmt_tm = *gmtime(&gmt); // Copy GMT result
        ist_tm = *localtime(&ist); // Copy IST result
    
        strftime(sgmt, sizeof(sgmt), "%A, %d %B %Y, %X", &gmt_tm);
        strftime(sist, sizeof(sist), "%A, %d %B %Y, %X", &ist_tm);
    
        printf("Current GMT: %s\n", sgmt);
        printf("Current IST: %s\n", sist);
    
        return 0;
    }