2012-05-10 1 views
7

tm 구조에서 tm_isdst 플래그 사용에 대해 다음과 같은 의심이 있습니다. 결과를 봤 사람 페이지 당과 표현 시간mktime 및 tm_isdst 플래그

B.에 대한 효과에 0의 값은 DST를 나타냅니다

A를하지 않는 다음과 같이 내가 그 가치를 해석하는 것을 이해 (1)의 값은 DST가 있음을 나타냅니다 사실

C. -1 값은 mktime이 DST가 유효한지 여부를 확인하게합니다.

나를 혼란스럽게하는 세 번째 요점입니다. 내 의심은 mktime이 DST의 적용 여부를 정확하게 파악할 수있는 방법입니다. 시간이 지남에 따라 예를 들어

My Time Zone = GMT + 3:00 
DST shifting = +1 Hour at 5:00 AM in January (to keep it simple) 
Current UTC time = "01/Jan/2012 00:00:00" 
UTC time in seconds time_t timetUTC = X seconds 
Hence my time is = "01/Jan/2012 03:00:00" 

은 나의 이해

tm tmMyTime = localtime_r(X + 2 * 60 * 60) will set tmMyTime.tm_isdst to 0 
tm tmMyTime = localtime_r(X + 3 * 60 * 60) will set tmMyTime.tm_isdst to 1 

이 방법으로 당

"01/Jan/2012 04:00:00"   (X + 1 * 60 * 60) 
"01/Jan/2012 05:00:00"   (X + 2 * 60 * 60) 
"01/Jan/2012 05:59:59"   (X + 2 * 60 * 60 + 59) 
"01/Jan/2012 05:00:00"   (X + 3 * 60 * 60) 
"01/Jan/2012 06:00:00"   (X + 4 * 60 * 60) 

을 내 시간 값의 변화를 다음과 같이도의 다른 모든 구성 요소하지만 tm 구조는 두 경우 모두 동일합니다. mktime (tmMyTime)은 p tm_isdst 값에 따라 로퍼 UTC 값.

이제 tmMyTime.tm_isdst = -1로 설정하면 mktime은 어떤 값을 반환할까요? 나는 TZ 변수, 시간 데이터베이스 등을 읽었습니다. 그럼에도 불구하고 논리적으로 mktime()은 DST 수정을 적용할지 여부를 두 번 발생할 수있는 tm 값에 적용 할 수 있습니까?

우리 시간대에는 DST가 없습니다. 그러므로 나는 내 이해가 이 맞는지 잘 모르겠습니다. 내가 틀렸다면 나를 바로 잡아주세요. 귀하의 도움을 많이 주시면 감사하겠습니다.

+4

현지 시간이 모호하다는 것을 알았습니다. 그것은. –

답변

4

요약하면 구현에 따라 다릅니다.

mktime은 로켈을 확인하여 DST 규칙을 알고 있습니다.

올해의 가장 큰 부분에 대해 mktime은 특정 현지 시간에 DST가 적용되는지 알아낼 수 있습니다. 문제는 실제로 DST가 뒤로 이동했을 때 (예 : 05:00:00 - 05:59:59) '중복'시간입니다. 이 로컬 시간 범위에서 tm_isdst = -1로 지정하면 mktime은 DST가 유효한지 여부를 알 수 없습니다. 이들 중 어느 것이 선택되는지는 구현마다 다릅니다. GNU 버전의 mktime을 사용하면 교대 이전의 UTC가 반환됩니다.

+1

감사합니다. Pat. 기껏해야 mktime만이 그렇게 느낄 수 있습니다. 그러나이 모호한 1 시간의 처리에 대한 명확한 설명이 없었습니다 (맨 페이지 포함). 나는 "tm = localtime_r (time_t)"다음에 매번 코드베이스에서이 플래그를 -1로 고의적으로 재설정하는 것에 대해 혼란스러워했습니다. 적어도이 경우에는 깃발을 그대로 놔둬 야한다고 생각했습니다. 또한 구현시 맨 페이지에이 동작을 명시해야한다고 생각합니다. 표준 함수는 항상 올바른 결과를 주거나 실패시 오류를 던지거나 적어도 맨 페이지에서 편차를 언급해야합니다. – mpathi

+0

좋은 답변입니다. 여기서 문제는 모든 사용자가 우리에게'struct tm'과 비슷한 것이고 시간대 정보에 대한 유일한 인터페이스가 Posix'mktime()'이라면 우리는이 문제를 스스로 해결할 수 없다는 것입니다. 사용자가 우리에게주는 "2013 년 11 월 3 일 1:30:00 AM"을 지정하도록 강요하거나'tm_isdst = -1'을 설정하여 최선을 다할 수 있습니다. –

1

나는 그것이 당신의 플랫폼에 어느 정도 의존 할 것이라고 생각합니다. Windows에서 mktime() 설명서는 "C 런타임 라이브러리는 일광 절약 시간 계산을 구현하기위한 미국의 규칙을 따릅니다"라고 말합니다. 따라서 DST 시작/종료 시점을 결정할 수있는 어딘가에 규칙 테이블이 있습니다. 주어진 해에 끝났다.

DST를 사용하지 않는 것이 좋습니다. 실시간 데이터 수집 및 프리젠 테이션 인 제 세상에서 DST는 큰 불편입니다!

+0

답장을 보내 주셔서 감사합니다. 그러나 mktime()이 그렇게 할 수있는 방법은 아직 명확하지 않습니다. 두 개의 UTC time_t 값은 로컬 시간대 (is_dst 제외)에서 동일한 tm 값을 가질 수 있으므로이 플래그를 -1로 재설정하면 논리적으로 mktime() 함수는 UTC 값 중 어느 것이어야하는지 전혀 알 수 없습니다 그것을 다시 변환하십시오. – mpathi

1

tm_isdst 일반적으로 모호한 시간을 해결할 수 없습니다. 이는 많은 시간대가 dst에서 nodst으로 점프하지 않고 오프셋 및 존 약어 만 변경하기 때문에 전환이 1 회 이루어지기 때문입니다. 그래서 두 시간 (전환 전후)은 모두 tm_isdst입니다. 일부 지역은 여름/겨울 시간을 전환 할 때 tm_isdst을 변경하지만 약어는 변경하지 않습니다 (예 : 호주/멜버른).