2017-02-07 14 views
1

В следующем примере для daylight test_daytime.cC (on win32): Как исправить значение дневного света больше 1?

#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-ВАУ) и 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 

Я предполагаю, что причина этого является MSVCRT, который используется в MinGW, см MinGW MSYS, MSVCRT, and the TZ environment variable, но не значение> 1 не совсем так (я знаю, что сказать, что страницы Справочника «не нуль ", но существуют ли какие-либо системы, которые не устанавливают значения на другое значение, чем 0/1)?

Любая идея, как исправить это (без изменения среды MSYS)?

+1

Что такое «дневной свет»? Обновление: Nvm, нашел его ... –

+2

Это не должно быть '1'. Допустимые значения: «zero» и «non-zero». Почему вы хотите «исправить» его, если он не «сломан»? –

+0

@EugeneSh. Я знаю, что в manpages говорится «не ноль» (как я писал в вопросе), но я не вижу, что результаты на самом деле правильные и задаются вопросом, устанавливают ли другие среды «дневной свет» другое значение, чем 0/1. Кажется, что 'daylight' для' AEDT' должен возвращать 0, не так ли? –

ответ

1

Если вы хотите, чтобы гарантировать, что любое истинное значение (т.е. не ноль) становится 1, самый простой способ заключается в использовании !!:

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

напечатает 1 для любого ненулевого значения дневного света (и 0, если значение равно нулю). (Надеюсь, у меня есть вопрос правильно)

+0

Согласитесь, используйте '!!' - ничего не исправлять. – chux