2015-02-06 8 views
0

UTC + 2에서 UTC + 0까지 dpkg-reconfigure tzdata을 사용하여 우분투 시간대를 변경했지만 다시 부팅 한 후에도 이전 시간대에 tz_minuteswesttv_sec을 표시하는 C 코드 gettimeofday()가 계속 실행되었습니다. 만은 gettimeofday()하면 아래의 C 코드를 실행 한 후 UTC + 0 시간을 보여주는에 시작 : GCC의 어떤 종류는 시간대의/libc의 독립적 인 구성쉘에서 시간대를 변경해도 재부팅 후에도 gettimeofday()에 영향을주지 않는 이유는 무엇입니까?

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

int main() 
{ 
    struct timeval tv; 
    struct timezone tz; 

    setenv("TZ", "UTC", 1); 
    tzset(); 

    gettimeofday(&tv, &tz); 
    tv.tv_sec -= 7200; 
    tz.tz_minuteswest = 0; 
    settimeofday(&tv, &tz); 

    gettimeofday(&tv, &tz); 
    printf("time: %llu, offset: %d\n", 
    (long long unsigned)tv.tv_sec, tz.tz_minuteswest); 
} 

있습니까? 전체 시스템에서 쉘에서 시간대를 변경하는 방법은 무엇입니까?

감사합니다.

+0

TZ 환경 변수로 시간대를 재정의 할 수 있습니다 (코드에서 수행 한 것과 동일합니다). 어쩌면 TZ는 프로그램이 시작되기 전에 UTC-2로 설정되어 있습니까? – StenSoft

+0

당신은'dpkg-reconfigure tzdata'를 실행하고이 샘플 코드를 함께 실행하여 전체 시스템의 시간대를 조정해야한다는 것을 의미합니까? –

+0

아니요. tzdata는 기본 표준 시간대 만 설정합니다. 모든 사용자와 모든 프로그램은 환경 변수 TZ를 사용하여 자유롭게이를 재정의 할 수 있습니다. – StenSoft

답변

1

GNU 시스템은 표준 시간대 정보를 나타 내기 위해 struct timezone을 사용하는 것을 지원하지 않습니다. 이것은 4.3 BSD의 구식 기능입니다. 대신 Time Zone Functions에 설명 된 시설을 사용하십시오.

+0

setenv() 호출로 설정된 TZ 변수의 셸 값을보고 변경하는 방법은 무엇입니까? –

+0

각 프로그램 (셸 포함)에는 자체 환경이 있습니다. 'setenv()'로 프로그램에서 그것을 바꿀 때 프로그램 밖에서는 볼 수 없지만 프로그램에서'getenv()'로 검사 할 수 있습니다. – StenSoft