일광절약시간 적용된 서버에서 UTC 타임을 구할려고 합니다.
제목대로 일광절약시간이 적용되어 있을 시 time() 함수를 이용하여 로컬시간을 구한 다음
이 값으로 UTC 타임을 구할려고 합니다.
정확하게는 제가 임의로 계산한 날짜수를 가지고 있습니다. 이값은 1970년 1월 1일부터
오늘까지의 경과된 날짜수를 계산한 것입니다. 이값과 서버에서 구한 시간(날짜)을 비교할려는 것입니다.
지금 쓰고 있는 방법은 time(NULL); 을 구한 다음 tzset() 함수를 부른 후 timezone 값을
빼주고 있습니다. 이 timezone 라는 값은 UTC와의 시간차를 초로 계산되어 있는 값입니다.
그런데 문제가 되는 것이 일광절약시간이 적용되어 있을 때 00시에 시간을 구하면 다시 말해
1시간이 모자라는 값이 구해져, 전날이 되어버립니다. 그렇다면 이 때는 timezone에서 한시간을
덜 빼던 덜 더하는 방법을 써야할 것 같은데, 이 일광절약시간이 적용되어 있나 안되어 있나를
체크를 해야되는 것이죠. tzset() 를 부르면 daylight 값이 세팅이 되는데, man 에 의한 설명으론
일광절약시간이 적용되어 있으면 0 이 아닌 값을 적용되어 있지 않으면 0 이 세팅되다고 합니다.
하여 테스트를 해보니 시간대는 PST, PDT로 하였습니다. 7월달은 일광절약시간 적용이 되어
daylight 값이 1인데, 시간을 12월달로 바꿔도 daylight 값이 1로 되어 있습니다.
하여 결론은 이 일광절약시간이 적용되어 있는지 아닌지 알 수 있는 방법이 있는가하는 것입니다.
유동적으로 값이 바뀌는 플래그가 있는가하는 것입니다. tm구조체의 int tm_isdst; 가 그런 역할을 하는지요?
위의 설명에 오류가 있으면 알려주세요. 아니면 다른 방법이 있는건가요?
tm_isdst는 현재
tm_isdst는 현재 tm구조체가 표현하는 시간이 dst구간내에 포함되어 있는가를 정확히 알려줍니다. 그런데 utc는 gmtime(_r)을 이용해서 바로 구할수가 있는데 굳이 그러한 방법까지 쓸 필요가 있을까요?
설명이
설명이 부족했나봅니다.
정확하게는 1970년 1월 1일 이후로 오늘까지 경과된 날짜수를 구할려고 합니다.
time(NULL); 로 초단위의 시간을 구하여 60*60*24 로 나누면 날짜수가 나오죠.
그런데 time 함수가 일광절약시간에 영향을 받는 것 같습니다.
이 일광절약시간이 적용중이거나 아닐 때에 같은 날짜수를 구할려고 하는 것입니다.
----------------
노력만이 살길이다.
노력만이 살길이다.
time() 함수는 timezone
time() 함수는 timezone 및 dst에 영향을 받지 않습니다. 하지만 60*60*24로 나눌경우 dst start day, end day에 문제가 발생할 소지가 생겨서 dst에 영향을 받는걸로 보일수 있습니다. dst start day는 하루가 23시간, dst end day는 하루가 25시간이 되죠. 이부분만 주의해서 프로그램 해보시면 될것으로 보입니다.
제 코드를 검색해 보니 저는 달력 형태로 오늘까지의 날짜수를 계산하더군요. 참고 하시기 바랍니다.
검색을 해봐도 잘
검색력이 딸리나 봅니다. 검색을 해봐도 잘 안찾아집니다. 익명으로 로그인을 하셔서 id 로 찾을 수가 없네요.
추가로 제 영어 실력이 모자랐나봅니다. man을 다시 보고 알았는데, daylight 는 일광절약시간 룰이 있으면 0 이 아닌 값을 가지는군요.
나라마다 일광절약시간 적용일이 다를 수가 있으니, localtime 함수로 시간을 알아내어 tm_isdst 로 플래그 검사를 한 후 일광절약시간이 적용되어 있으면 1 시간을 덜빼면 되겠군요.
아니면 TZ 환경설정을 UTC 에 해당하는 것을 바꾼 후 putenv 하여 시간을 구하는 방법은 어떤가요?
테스트해봐야겠습니다.
----------------
노력만이 살길이다.
노력만이 살길이다.
댓글 달기