以下样本用于daylight测试

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int
main (void)
{
    char *tzval;

    tzval = "TZ=";
    putenv(tzval);
    tzset();
    printf ("tz: \"%40s\" - daylight: %d\n", tzval, daylight);

    tzval = "TZ=EST+5EDT,M3.2.0/2,M11.1.0/2";
    putenv(tzval);
    tzset();
    printf ("tz: \"%40s\" - daylight: %d\n", tzval, daylight);

    tzval = "TZ=AEDT";
    putenv(tzval);
    tzset();
    printf ("tz: \"%40s\" - daylight: %d\n", tzval, daylight);

    return 0;
}

编译时使用
$gcc test_daytime.c -o test_daytime.exe && ./test_daytime.exe

在Cygwin(uname:Cygwin_NT-10.0-WOW)和MSYS2(uname:MSYS_NT-10.0)上生成以下输出
tz: "                                     TZ=" - daylight: 0
tz: "          TZ=EST+5EDT,M3.2.0/2,M11.1.0/2" - daylight: 1
tz: "                                 TZ=AEDT" - daylight: 0

这是MSYS上的结果(uname:MINGW32_NT-6.2,同一台机器)
tz: "                                     TZ=" - daylight: 1
tz: "          TZ=EST+5EDT,M3.2.0/2,M11.1.0/2" - daylight: 69
tz: "                                 TZ=AEDT" - daylight: 84

我假设原因是MinGW中使用的MSVCRT,请参见MinGW MSYS, MSVCRT, and the TZ environment variable,但值>1是否完全错误(我知道手册页上说“不为零”,但是否有任何系统没有将值设置为与0/1不同的值)?
知道如何解决这个问题吗(不改变MSYS环境)?

最佳答案

如果要确保任何真(即非零)值变为1,最简单的方法是使用!!

printf ("tz: \"%40s\" - daylight: %d\n", tzval, !!daylight);

将为日光的任何非零值打印1(如果该值为零,则打印0)。
(希望我答对了你的问题)

10-02 01:38
查看更多