저번에 time_t를 struct tm으로 변환하는 함수인 localtime을 배웠습니다. 이번에는 struct tm을 time_t로 바꾸는 함수를 배워봅시다. 그 중 하나는 mktime() 이라는 함수인데요. 이것은 현재 날짜와 시간을 알 때, 1970년 1월 1일부터 현재까지 흐른 시간을 초 단위로 리턴해 주는 함수입니다.

 

 

[관련글]

C언어 localtime 함수 알아봅시다.

 

 

 혹여나, localtime이라는 함수가 무엇인지 잘 모르신다면 관련글을 먼저 보고 오시는 것도 좋겠습니다.

 

 


 개략적으로, time_t를 struct tm으로, 다시 struct tm을 time_t로 변환해주는 메서드는 다음과 같습니다.

 

 

 여태까지 배웠던 것에 의하면 말입니다. 예를 들어서, 현재의 날짜가 1970년 1월 3일 0시 0분 0초입니다. 그러면 tm 구조체에는 아래와 같이 저장이 되어 있을 겁니다.

 

 

 그러면 이 시간은 1월 1일 0시 0분 0초로부터 2일이 경과된 시간이므로 86400에 2를 곱한 172800이 리턴이 될 거에요. 정말 이렇게 상호 변환이 될까요? 여기서 우리는 한 가지 기준점을 빠트렸습니다. 1970년 1월 1일이 어느 지역을 기준으로 한 시간인지가 빠진 겁니다. 서울? 아니면 시에틀? 아니면 베이징? 아니면 런던? 간단하게 프로그램을 만들어서 테스트를 해 봅시다.

 

 mktime 함수는 다음과 같이 쓰면 됩니다.

 

 

time_t mktime(struct tm *day);

 

 

 tm 구조체의 주솟값을 넘겨주고 있습니다.

 

 

 저는 in_day_data에서 날짜와 시간에 대해서 초기화를 해 주었는데요.

 

 

 그냥 여기는 시간과 날짜 등을 설정하는 겁니다. 몇 월인지, 몇 년도인지는 조심해야 합니다.

 

 

 t1, t2, t3을 출력해 주었는데요. 각각 1970년 1월 1일부터 경과된 시간을 출력하는 겁니다.

 

 

 그런데 1월 3일 0시 0분 0초는, 제가 예상했던 172800이 아니라 140400이 나옵니다. 이건 어떻게 된 일일까요?

 

 


 

 date 명령어로 현재 시간대도 같이 출력할 수 있는데요. KST입니다. 저는 한국 시간대를 기준으로 출력했어요. 이것은 UTC와 몇 시간이나 차이날까요? tzselect는 리눅스의 타임존을 설정할 수 있는 것인데요.

 

 

 Asia의 Seoul을 클릭하면, 정확히 UTC랑 9시간이 차이난다는 것을 알 수 있어요. 그러면 1970년 1월 1일 UTC 0:00은 1970년 1월 1일 KST 9:00과 같을 겁니다. 이 시간으로부터 흐른 초가 140400초이기 때문에 140400이 리턴됩니다.

 

 

 기준시는 UTC 0:00이기에, KST로는 9:00인 셈입니다. 그래서 172800에서 22400이 빠진 140400이 나옵니다. 그러면 이것은 어느 파일로부터 읽어온다는 소리가 됩니다.

 

 


 타임존을 베이징 시간대, 이것은 Asia/Shanghai입니다. 요렇게 설정하고, /etc/localtime 파일을 열어봅시다. 

 

 

 대부분의 문자가 깨지는데, CST-8이라는 것은 확실히 알 수 있습니다. 이제 다시 서울 시간대로 바꿔 봅시다.

 

 

 localtime 파일의 맨 밑에 줄이 KST-9로 바뀌는 것을 볼 수 있어요. 그러면, 실제로 이 파일을 mktime을 호출하면 읽을 거에요.

 

 

 그러니까 timezone을 얻고, 그것을 통해서 localtime을 기준시, UTC로 변환 후에 계산하겠네요. 실제로, 타임존을 shanghai로 바꾸고 실행을 시켜 봅시다.

 

 

 상하이 시간은 UTC보다 8시간 빨라요. 그러니까 172800에서 28800이 빠지겠지요. 그래서 1번째 값이 144000이 출력이 됩니다.

 


 그러면 정리해 봅시다. 현재 내가 설정되어 있는 시간을 UTC 시간으로 변환합니다. 예를 들어, 현재 내가 설정되어 있는 시간대가 서울이고, 시간이 17:18이라면, UTC 시간으로는 08:18입니다. 이것을 T라고 합시다. 1970년 1월 1일 0시 0분 0초를 시간 T'이라 합시다. mktime 함수는 T'가 T로부터 몇 초나 경과되었는지를 리턴해 주는 함수입니다.