localtime报告错误的小时数和isdst标志

问题描述

更新代码11/06/20

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

注意:

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

关于此问题有很多SO帖子,但没有一个直接解决此问题。

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

下面是我的代码(与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运行)

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

解决方法

我的猜测是您在时间函数中使用的是未初始化的值,而没有捕获其返回值。

尝试一下:

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

非常非常奇怪。如果找到我是否设置env var“ TZ”,localtime()可以正常工作。 Strange 是什么,它与我设置的内容没有什么区别,例如“ XXX”。