2012-09-21 7 views
1

이 사람은 지금 좋은 순간을 위해 나를 괴롭혀 왔습니다. 나는 C++로 작성된 프로그램을 작성 중이며 두 개의 다른 서버간에 ISO8601로 인코딩 된 시간을 보낼 수 있어야합니다. 여기서 가장 중요한 것은 Windows 인 것 같습니다.UTC tm *을 현지화 된 tm *으로 변환하는 교차 플랫폼 방식?

지금까지 와이어에서 날짜/시간 문자열을 쉽게 읽고 tm*으로 바꾸기 위해 NetBSD에서 strptime()을 포팅했습니다. 그러나 올바르게 현지화 된 tm*으로 바꿀 때 완전히 뒤죽박죽이므로 strftime()을 사용하여 현지 시간대의 사용자에게이 시간을 표시 할 수 있습니다. 순진한 접근법은 단순히 localtime(time(0))gmtime(time(0))의 차이를 취하는 것이지만 일광 절약 시간이 포함 된 임의의 날짜에는 일관성이 없습니다.

필자가 취한 접근법은 POSIX 날짜 및 시간 함수 만 사용하고 필요한 경우 나중에는 strptime()에서 수행하고 나중에는 필요할 경우 timegm()에서 수행 할 수 있습니다. 나는 그 일을 계속하는 것을 선호하지만 간단한 사실은 리눅스의 구조체에 Windows의 tm* 구조체가 없다는 것입니다. 따라서 선택의 여지가 없지만 #if WIN32에 의해 보호되는 이식성이없는 코드를 작성하는 것이 좋습니다. 나는 또한 이것을 위해 부스트를하지 않아도되는 것을 선호한다.

+0

당신이 부스트를 사용하지 않으려는 경우에도, 나는 아직도이 문제가 해결되면 당신이 부스트를 사용하는 것이 좋습니다 ... – villintehaspam

답변

1

struct tm *utc_tm 당신이 timegm 다음 localtime를 사용하여 struct tm *local_tm에 그 (이식성) 설정 사용 time_t utc으로 바꿀 수 있습니다 감안할 때 : 나는 무엇을 말할 수에서

time_t utc = timegm(utc_tm); 
struct tm local_tm; 
localtime_r(&utc, &local_tm); 

timegm의 간단한 구현은 일을 포함 월 표를 사용하여 자신을 변환하고 윤년 계산. 당신의 strptimetm_yday 채 웁니다 경우 또는 올바르게 https://stackoverflow.com/a/9076848/567292에서 공식을 사용할 수 있습니다

tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 + 
    (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 - 
    ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400 
+0

당신의 대답은 내가 처음에 혼란 스러웠습니다. 왜냐하면 이것이 제가 버린 접근법이기 때문입니다; 나는 time_t가 Windows의 시간대로 옮겨 졌다는 잘못된 인상을 받았습니다. 그러나 MSDN을 자세히 살펴보면 사용자의 접근 방식이 정확함을 확인할 수 있습니다. 감사! – AlexMax

관련 문제