본문 바로가기

단편글

struct tm 을 쓸 때 하는 실수들

기능 개발을 하면서 가져온 데이터의 시간을 파싱하는 일을 많이 한다.

보통 가져온 데이터들은 앞 7자리를 시간으로 나타내는데,

년도 2bytes(년도를 통채로 hex화 한다. 즉, 2020년이면 07 e4가 된다.), 월 1byte, 일 1byte, 시 1byte, 분 1byte, 초 1byte로 표시한다.

이렇게 가져온 시간값을 비교하는 작업을 종종 하는데, 할 때마다 자꾸 실수를 하여 금방 끝날일을 오래 걸리게 한다.

 

struct tm을 time_t 로 변환하는 작업

이렇게 나뉘어져있는 값을 편하게 비교하기 위하여 time_t로 바꾸어 비교하면 간단히 상수 비교를 할 수 있어 이런 식으로 종종사용한다.

여기서 자주 실수하는 일은 선언한 struct tm 을 초기화하지 않는 것이다.

struct tm을 초기화 하려면 localtime을 이용하여 초기화하면 된다.

그런데 이걸 초기화하지 않고 그냥 넣어버리니 년도부터 이상하게 나온다.

분명 2020 - 1900을 넣었는데, 128이 아닌 120이 나오는 경우다.

이건 지금 쓰고 있는 mbed OS 문제인지도 모르겠다.

아무튼 이 부분을 localtime을 이용하여 설정한 후에 값을 넣어주면 잘 들어간다.

아직도 이 이유를 잘 모르겠다.

 

또 자주하는 실수가 년도는 -1900 하는걸 잘 기억하는데, 월을 자꾸 그냥 넣는다.

이러면 1개월이 차이나므로 time_t로 가져오면 꽤 큰 차이가 난다.

tm_mon의 범위는 0-11까지인걸 항상 기억해두어야 한다.

안그러면 시간이 다음달로 넘어가게 되버린다.

'단편글' 카테고리의 다른 글

URI에서 IPv6 사용  (0) 2020.10.15
Linux에서 JNI 쓸 때 라이브러리 문제  (0) 2020.09.25
DP 문제. 어렵다  (0) 2020.07.13
모든 조합을 구하는 문제 (순열)  (0) 2020.07.07
priority queue와 vector의 최소값  (0) 2020.07.02