2016-06-12 2 views
-1

환경 : Ubuntu 14.04.GMT를 현지 결과로 1 년 차이로 변환

그리니치 표준시로 지정된 struct tm 고장 시간을 저장하려고합니다.

다음
void mygmt(int year, int month, int day, int hour, int minute, int second) { 
    struct tm gmtTime; 

    memset(&gmtTime, 0, sizeof(struct tm)); 

    gmtTime.tm_mday = day; 
    gmtTime.tm_mon = month - 1; // 0-based 
    gmtTime.tm_year = year - 1900; 
    gmtTime.tm_hour = hour; 
    gmtTime.tm_min = minute; 
    gmtTime.tm_sec = second; 
    gmtTime.tm_zone = "GMT"; 

    char buffer [80]; 
    strftime (buffer,80,"GMT time: %b %d, %G %I:%M:%S %p %Z.", &gmtTime); 
    puts(buffer); 

    time_t rawtime = timegm(&gmtTime); 
    struct tm* timeinfo = localtime (&rawtime); 
    strftime (buffer,80,"Local time: %b %d, %G %I:%M:%S %p %Z.",timeinfo); 
    puts(buffer); 
} 

내가 그것을 호출 오전 방법은 다음과 같습니다 : 여기

// June 11, 2016 23:34:03 (in GMT) 
mygmt(2016, 6, 11, 23, 34, 3); 

그리고 출력있어 :

GMT time: Jun 11, 2015 11:34:03 PM GMT. 
Local time: Jun 11, 2016 04:34:03 PM PDT. 

내가 현지 시간은 GMT -7 시간이 될 것으로 기대 여기 내 C++ 기능입니다 출력의 일부가 옳은 것 같습니다. 내가 혼란스러워하는 부분은 GMT 시간에 대한 결과입니다. 그것은 내가 지정한 값과 1 년 차이가 있음을 보여줍니다. 어떻게 수정해야합니까?

+0

C는 C++가 아닙니다. C++로 컴파일하면 태그를 스팸하지 마십시오. – Olaf

답변

2

strftime를 호출하기 전에, tm가 0으로 설정 -fields 채우기 위해 timegm 전화 :

// ... 

time_t rawtime = timegm(&gmtTime); 

char buffer [80]; 
strftime (buffer,80,"GMT time: %b %d, %G %I:%M:%S %p %Z.", &gmtTime); 
puts(buffer); 

struct tm* timeinfo = localtime (&rawtime); 
strftime (buffer,80,"Local time: %b %d, %G %I:%M:%S %p %Z.",timeinfo); 

// ... 

참고 : 당신은 (조금 복잡하다) 대신 % G %의 Y를 고려할 수 있습니다.

참조 : std::mktime and timezone infoEasy way to convert a struct tm (expressed in UTC) to time_t type.

+0

그랬습니다. 당신의 도움을 주셔서 대단히 감사합니다. – Peter