2017-09-16 1 views
0

현재 시스템 시간에 액세스 할 수 있도록 Time 개체가 필요한 C++ 응용 프로그램을 작성하고 있습니다. 이렇게하려면 time.h을 사용합니다. 단위 테스트 때 시간 변경을하지 못하기 때문에struct tm 'tm_isdst'플래그를 사용하는 올바른 방법입니까?

Time::Time(bool p_daylightSavingEnabled /* = true */) 
{ 
    time_t rawTime = time(nullptr); 
    struct tm* timeInfo = localtime(&rawTime); 

    timeInfo->tm_isdst = static_cast<int>(p_daylightSavingEnabled); 

    m_hours = timeInfo->tm_hour; 
    m_minutes = timeInfo->tm_min; 
    m_seconds = timeInfo->tm_sec; 
} 

모든 내가 추가 한 tm_isdst 플래그의 사용을 제외하고 꽤 정직하지만, 여전히 나에게 신비 : 내 두 생성자는 다음과 같이 이동합니다. 인터넷에서이 플래그를 올바르게 사용하는 방법에 대한 명확한 문서를 찾지 못했지만 일부 시스템에서는 사용할 수없는 (즉, 0으로 설정) 것도 없다고 들었습니다.

tm_isdst을 사용하는 올바른 방법이며, 그렇지 않은 경우 (예 : 생성자에서) 다른 시스템에서 제대로 작동하려면 어떻게 사용해야합니까?

설명 : 지금은 time.h의 대안에 관심이 없습니다.

+1

아니요; 'localtime'이 반환하는 것을 봐야합니다. 당신은 더 많은 보상 적 변화없이 무시되거나 무시 될 수 있다고 주장해서는 안됩니다. 그리고 네, 일반적으로 잘못 정의되어 있습니다. –

+0

@JonathanLeffler * 보상 적 변경없이 무시하거나 무시할 수있는 척해서는 안됩니다. * 더 많은 보상 적 변경이 있다는 것은 무엇을 의미합니까? 내가 볼 수있는 모범이 있습니까? – BobMorane

+0

'localtime'에 대한 매뉴얼 페이지는'is_dst'의 ​​의미를 완전히 설명합니다. 'localtime' 매뉴얼 페이지에서 그 필드에 대한 설명이 불분명하다면, 정확히 무엇이 당신에게 불분명한지 설명해야합니다. –

답변

0

코드는 간단해야한다 :

Time::Time() 
{ 
    time_t rawTime = time(nullptr); 
    struct tm* timeInfo = localtime(&rawTime); 

    m_hours = timeInfo->tm_hour; 
    m_minutes = timeInfo->tm_min; 
    m_seconds = timeInfo->tm_sec; 
} 

은 "지금"DST가 온 또는 오프인지 기계를 이야기 할 필요가 없습니다 무엇 타임 아웃 찾기. 그것은 이미 알고 있습니다.

추신 : 귀하의 코드는 아무 이유없이 thread-unsafe입니다.이 문제를 해결하려면 localtime_r()을 사용하십시오.

+0

@johnswinck DST 플래그를 다루지 않고 내 시스템이 일광 절약 시간제를 지원하면 올바르게 이해하면 시간을 변경 (변경) 할 때 알아야한다. 즉, DST 플래그를 읽을 때 프로그래머에게 시스템이 일광 절약 시간을 지원하는지 여부를 알려주는 것입니다. – BobMorane

+1

DST 플래그는 시스템이 현재 DST 상태인지 여부를 알려주는 유일한 것입니다. 시스템은 DST의 시간을 언제 바꿀 것인지를 알고 있습니다. –

관련 문제