[C/C++ 완전정복 목차 링크]
안녕하세요 블로그 주인장 양햄찌입니다.
오늘은 정말정말 많이 사용되는 날짜 및 시간 표현법을 알아봅시다.
들어가기 전 서론
이 함수는 언제 유용할까요?
프로그램이 실행된 날짜를 찍거나...
특정 함수가 수행된 시간을 찍거나...
로그에 날짜/시간을 남긴다던가..
실행시간을 측정한다던가..
시분초+랜덤+pid 등 여러 가지를 조합해 unique값을 생성한다던가..
일일이 설명하지 않아도 될정도로 필요한 상황은 무지무지하게 많습니다. 그만큼 많이 사용되는 함수인거죠~!
오늘은 이때 유용하게 사용할 수 있는 날짜/시간 관련 대표 함수들을 살펴볼게요.
헤더 HEADER
#include <time.h>
time() 함수 - timestamp값 출력
[문법 SYNTAX]
time_t time( time_t* seconds )
time를 사용하면 결과로 1970년 1월 1일 UTC기준 00:00:00으로부터 얼마나 많은 초가 흘렀는지를 세어서 반환해줘요. [유닉스 timestamp 기준]
[간단하게 확인해보기]
//C언어
#include <stdio.h>
#include <time.h>
int main()
{
time_t seconds;
printf("since 1970 :%d\n", time(&seconds)); //리턴값 체크
printf("seconds: %d\n", seconds); //인자값 체크
return 0;
}
단순히 인자값과 리턴값을 확인해보는 소스입니다.
이렇게 오랜 시간이 지났습니다 하핳. 저 때로부터 1594699752초 지났다고 하네요.
결과를 확인해보면 인자값과 리턴값 동일한 값을 저장해주는 것을 확인할 수 있어요.
[실행시간 측정]
#include <stdio.h>
#include <time.h>
#include <Windows.h> //Sleep 함수를 위한 헤더
int main() {
time_t begin;
time(&begin);
Sleep(3000); //3초기다림
time_t end;
time(&end);
printf("실행시간 %0.0f초\n", difftime(end, begin));
return (0);
}
위와 같은 방식으로 time함수를 이용해서 실행시간을 측정할 수 있어요.
그런데, time함수는 기본 단위가 초(second)이니까 만약 실행시간이 초보다 빠르다면 0으로 결과가 나와서 정확한 측정은 할 수 없습니다. (참고로 그럴 경우 clock함수를 사용하면 됩니다)
하지만 수행시간이 좀 걸려 초단위일 경우 이런 방식으로 실행시간을 측정할 수 있어요.
근데 우리가 원하는건 초 단위로 보여주는 결과가 아니죠?!
2020년 07월 14일 11시 15분 28초 이런 형태의 날짜/시각 포맷을 원해요.
이 커다란 값의 초를 알아서 계산해서 원하는 결과로 보여줄 함수가 필요합니다.
localtime() 함수 - 보기쉽게 formatting해서 줌
[문법 SYNTAX]
struct tm* localtime(const time_t* timer);
localtime 함수는 time함수 결과로 나온 저 알아보기 힘든 초 값을 우리가 알기 쉽게끔 계산해 tm구조체 형식으로 리턴해줍니다. 그래서 리턴 타입이 구조체인데요.
tm구조체는 아래처럼 구성되어있어요.
struct tm
{
int tm_sec; // seconds after the minute - [0, 60] including leap second
int tm_min; // minutes after the hour - [0, 59]
int tm_hour; // hours since midnight - [0, 23]
int tm_mday; // day of the month - [1, 31]
int tm_mon; // months since January - [0, 11]
int tm_year; // years since 1900
int tm_wday; // days since Sunday - [0, 6]
int tm_yday; // days since January 1 - [0, 365]
int tm_isdst; // daylight savings time flag
};
여기서 원하는 매개변수 값만 쏙쏙 뽑아 우리의 목적에 맞게 사용하면 되는 거랍니당.
근데 주의해야할 점은 tm_year와 tm_mon 부분인데요. 주석에 설명되어 있는 부분을 보면 tm_year는 1900으로부터 지난 기간만큼의 년수고, tm_mon은 0부터 11까지로 적혀있습니다.
우리가 아는 '월'은 1월부터 12월까지 있자나요?!
현재 2020년이라고 하면 7월이라 했을 때 tm_year에 2020이, tm_mon에 7이 저장되어야 할 것 같지만 사실 그렇지 않다는 사실!! 이를 맞춰주기 위해 실제 현재 날짜를 구하려면 tm_year에는 1900을 더하고, tm_mon에는 +1을 해줘야해요.
[간단하게 확인해보기]
#include <stdio.h>
#include <time.h>
#include <string.h>
int main()
{
time_t tnow;
struct tm* t;
time(&tnow);
t = (struct tm*) localtime(&tnow);
printf("tm_year :%d, tm_year+1900 :%d\n", t->tm_year, t->tm_year + 1900);
printf("tm_mon :%d, tm_mon+1 :%d\n", t->tm_mon, t->tm_mon + 1);
return 0;
}
보시면 1900을 더해야 올해인 2020이 나오고, 월에는 1을 더해야 이번달인 7이 나옵니당. 그럼 이 정보를 토대로 현재날짜+현재시간 정보를 string으로 출력하는 함수를 만들어봅시다.
#include <stdio.h>
#include <time.h>
#include <string.h>
int GetDateTime(char*);
int main()
{
char datetime[16];
memset(datetime, 0x00, sizeof(datetime));
printf("tnow: %d\n", GetDateTime(datetime));
printf("datetime: %s", datetime);
return 0;
}
int GetDateTime(char* datetime)
{
struct tm *t;
time_t tnow;
tnow = time(NULL);
t = (struct tm*) localtime(&tnow);
sprintf(datetime, "%04d%02d%02d%02d%02d%02d", \
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
return (int)tnow;
}
오늘이 만약 '2020년 7월 14일 오후 11시 46분 28초'라고 하면, 20200714234628로 출력되도록 소스를 짜봤어요 :)
오늘은 간단하게 time함수와 localtime 함수에 대해 알아봤습니다. 자주 사용하는 함수라 알아두면 유용하게 사용하실 수 있을거예요.
도움이 되셨다면 공감/광고보답/댓글 중 하나로 표현해주시는건 어떨까요?! 오늘도 고생하셨습니다. 다음에 뵈어요~!
최신 댓글