2009-07-23 7 views
6

C에서 시간대 사이의 시간을 변환해야합니다 (Linux에서는 특정 작업도 가능).C에서 시간대 변환

저는 현재 시간, 로컬 및 UTC를 알고 있습니다. 목표 시간의 오프셋이 있습니다. 나는 mktime, gmtime, localtime 및 이와 유사한 함수 집합을 사용하려고 시도하고 있지만 여전히 그것을 파악할 수는 없다.

미리 감사드립니다.

답변

5

은 " 당신의 "지역"시간에서 다른 시간. 그런 다음 struct tm을 달력 시간으로 변환하고 원하는 시간 (대상 시간의 오프셋)을 추가 한 다음 struct tm으로 다시 변환합니다.

(mktime의 정규화를 사용하는 다른 시나리오를 고려하여 편집 됨)

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

int main(int argc, char *argv) { 
    struct timeval tv_utc; 
    struct tm *local_tm, *other_tm; 

    /* 'synthetic' time_t to convert to struct tm for the other time */ 
    time_t other_t_synt; 
    /* Other time is 1 hour ahead of local time */ 
    int other_local_delta = 1*3600; 


    /* the below two lines are just to set local_tm to something */ 
    gettimeofday(&tv_utc, NULL); 
    local_tm = localtime(&tv_utc.tv_sec); 

    printf("Local time: %s", asctime(local_tm)); 

    #ifdef DO_NOT_WRITE_TO_LOCAL_TM 
    other_t_synt = mktime(local_tm) + other_local_delta; 
    #else 
    local_tm->tm_sec += other_local_delta; 
    /* mktime will normalize the seconds to a correct calendar date */ 
    other_t_synt = mktime(local_tm); 
    #endif 

    other_tm = localtime(&other_t_synt); 

    printf("Other time: %s", asctime(other_tm)); 

    exit(0); 
} 
+0

이것은 잘 작동하는 것 같습니다. local_tm-> tm_sec + = 3600;을 사용하려고합니다. other_t = mktime (local_tm); 대신에 mktime이 나를 위해 모든 정규화 작업을하도록하십시오. – verma

+0

그래, 그것도 잘 작동해야한다 -이 예의 local_tm이 가리키는 메모리가 내 코드에 속하지 않기 때문에 예의 바르고 다른 누군가의 메모리에 쓰는 것을 피하려고했다. –

+0

그게 좋은 지적입니다. – verma

0

운영 체제가이를 지원합니다.

유닉스에서 파생 된 OS에서는 asctime, asctime_r, ctime, ctime_r, difftime, gmtime, gmtime_r, localtime, localtime_r, mktime, timegm의 man 페이지를보고 싶을 것입니다.

+1

언급 한 Posix API는 실제로 질문에 대한 질문에 대한 분명한 방법을 제공하지 않습니다. 질문에는 이미 이러한 함수 중 일부가 이름으로 언급되어 있으므로 다시 언급하고 맨 페이지를 가리키는 것은 기본적으로 유용한 대답이 될 수 없습니다. –

2

오프셋을 알고 있다면 gmtime()과 tm 구조를 사용하여 직접 설정할 수 있습니다.

현지 시간과 UTC를 알고있는 경우 로컬 오프셋을 알 수 있습니다. 목표 오프셋을 알고 있다면 tm_hour를 적절하게 설정하는 것뿐입니다 (그리고 < 또는> 23으로 설정하면 잠재적으로 하루를 뒤집을 수도 있습니다).

일부 샘플 코드는 gmtime reference page을 참조하십시오. 시간대 오프셋을 기준으로 오프셋을 표시합니다.


편집 : 코멘트에 응답에서

- 당신은 또한 mktime은 당신이 time_t로 다시 변환하여이 문제를 단순화 할 수 당신을 위해 이동을 처리하도록 할 수 있습니다. 당신은 같은 것을 사용할 수 있습니다

당신이 "로컬"시간을 알고 "UTC"시간, 당신은 오프셋을 계산할 수 있다면 .. 별도의 답변으로 게시, 코드를 게시 할 수 없습니다 댓글
time_t currentTime; 
tm * ptm; 
time (&currentTime); 
ptm = gmtime (&rawtime); 
ptm->tm_hour += hours_to_shift; 
ptm->tm_minutes += minutes_to_shift; // Handle .5 hr timezones this way 

time_t shiftedTime = mktime(ptm); 
// If you want to go back to a tm structure: 

tm * pShiftedTm = gmtime(&shiftedTime); 
+2

FWIW뿐만 아니라 tm_hour - 예 : 인도 표준시 (IST)는 UTC + 5.5입니다. –

+0

예. 잠재적으로 거의 모든 필드를 조작해야하지만 개념은 건전합니다. –

+0

사실, 수동으로 너무 많은 수작업을하는 것을 피하는 방법이 있다고 생각합니다. 주석은 코드를 허용하지 않기 때문에 다른 답변으로 게시 할 것입니다. –