2010-02-16 3 views

답변

6

tzset()과 time/gmtime/localtime/mktime 함수를 함께 사용해야합니다.

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

#include <time.h> 

time_t makelocal(struct tm *tm, char *zone) 
{ 
    time_t ret; 
    char *tz; 

    tz = getenv("TZ"); 
    setenv("TZ", zone, 1); 
    tzset(); 
    ret = mktime(tm); 
    if(tz) 
     setenv("TZ", tz, 1); 
    else 
     unsetenv("TZ"); 
    tzset(); 
    return ret; 
} 

int main(void) 
{ 
    time_t gmt_time; 
    time_t local_time; 
    struct tm *gmt_tm; 

    gmt_time = time(NULL); 
    gmt_tm = gmtime(&gmt_time); 
    local_time = makelocal(gmt_tm, "CET"); 

    printf("gmt: %s", ctime(&gmt_time)); 
    printf("cet: %s", ctime(&local_time)); 

    return 0; 
} 

기본적으로,이 프로그램은 GMT (시간 (NULL))와 같은 현재 컴퓨터의 일이 소요되며, CET로 변환 :

이 시도

$ ./tolocal 
gmt: Tue Feb 16 09:37:30 2010 
cet: Tue Feb 16 08:37:30 2010 
3

M. 마리의 대답은 않습니다 실제로 제기 된 질문에 대해 작동하지 않습니다. tzset()은 POSIX이지만 원래 질문의 제목이 ANSI C가 아닙니다. C90 또는 C99 (초안 표준 검색에서 최종 표준에 액세스 할 수 없음)에 대해서는 언급이 없습니다.

OP의 질문은 아마도 "utc time"이 의미하는 바가 분명하지 않기 때문에 아마도 다소 모호합니다. 아마도 그는 깨진 구성 요소를 의미 할 것입니다. struct tm으로 채워 보겠습니다.

strftime("%z",...)의 출력을 구문 분석하여 C99에서 로컬 TZ의 오프셋을 확인할 수 있습니다.이 오프셋은 시간이 지남에 따라 변경되므로 사용자 고유의 날짜 값으로 호출해야합니다. 그러나이 포맷 코드는 C90에서 사용할 수 없으므로 strftime("%Z",...)의 출력을 구문 분석하려고하지 않는 한 AF90에서 C90을 준수해야한다면 AFAIK를 사용할 수 있습니다.하지만 기본적으로 이식 할 수 없습니다.

을 사용하면 mktime()을 사용하여 UTC 구성 요소를 현지 표준 시간대로 해석 할 수 있습니다. 그런 다음 오프셋을 적용하고 localtime()을 사용하여 분류 된 구성 요소로 다시 변환하십시오. 로컬 표준 시간대가 DST로 또는 DST로 전환 될 때 (또는 적용되는 경우 시간대 오프셋이 변경된 시점)에는 가장자리 상황에 처할 수 있지만 DST를 사용하지 않는 로캘로 이동하면 쉽게 피할 수 있습니다. tm_dst0으로 설정하면 strftime()mktime()을 모두 호출 할 수 있습니다.

또는 ANSI C로 제한하지 마십시오.