localtime() 报告不正确的小时和 isdst 标志

localtime() reports incorrect hour and isdst flag

更新代码 11/06/20

当地时间报告的 tm_hour(+1 小时)和 tm_isdst(1 小时)不正确。

备注:

  1. 我在东部时区
  2. 目前是 11 月 6 日(不是夏令时)。
  3. 未设置环境变量 TZ。
  4. 控制面板(日期和时间)设置为“(UTC-05:00) 东部时间(美国和加拿大)”。

关于这个问题有很多 SO 帖子,但 none 直接解决了这个问题。

这是一个错误还是我做错了什么?

我的代码如下(使用 MSVC“Win32 Debug”编译,运行 在 Win10-64 上):

//  localtime.c - Test Program for localtime()

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>

    int
    main(int argc,char **argv)
    {
        time_t utc;
        struct tm *tm;
    
        utc = time( NULL );
        tm = localtime( &utc );
    
        printf( "Program localtime.exe:\n" );
        printf( "Env Var TZ: %s\n", getenv( "TZ" ) );
        printf( "tm->tm_hour:  %d\n", tm->tm_hour  );
        printf( "tm->tm_isdst: %d\n", tm->tm_isdst );
    
        printf( "Press any key to exit...\n" );
        getch();
        exit( 0 );
        return( 0 );
    }     

程序输出(运行 在 10:20 AM EST)

Program localtime.exe:
Env Var TZ: (null)
tm->tm_hour:  11
tm->tm_isdst: 1

我的猜测是您在时间函数中使用了一个未初始化的值并且没有捕获它的 return 值。

试试这个:

   time_t ltime;
   struct tm *tm;
   ltime = time( NULL );
   tm = localtime( &ltime );

非常非常奇怪。如果发现我设置了环境变量“TZ”,则 localtime() 工作正常。 Strange 是什么,我把它设置成什么都没有关系,例如"XXX".