본문 바로가기

별걸다하는 IT/프로그래밍언어

[C언어] 현재 날짜/시간 구하기 localtime , time 함수 사용법, 실행시간측정, 년월일시분초 출력하기

[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 함수에 대해 알아봤습니다. 자주 사용하는 함수라 알아두면 유용하게 사용하실 수 있을거예요. 

도움이 되셨다면 공감/광고보답/댓글 중 하나로 표현해주시는건 어떨까요?! 오늘도 고생하셨습니다. 다음에 뵈어요~!