C 언어 - time.h

컴퓨터/C

728x90
반응형

C 언어와 시간 

프로그래밍의 영역에서 시간의 개념은 상당히 중요합니다. 그리고 다양한 영역에서 사용됩니다. 본 포스트에서는 C언어에서 시간을 다루는 항목들을 제공해주는 time라이브러리를 알아보도록 하겠습니다.

 

자료형 time_t

time.h에는 time_t의 자료형을 제공해줍니다. time_t 자료형은 시간을 편리하게 정의하기 위해 만든 자료형입니다.

 

시간을 출력하기 위한 time() 함수

time함수는 time_t자료형의 형태로 1970년 1월 1일 00시 00분(UTC)부터 지금까지의 초단위 시간을 출력합니다.

다음과 같은 소스코드를 작성한다면 1970년 1월 1일 00시 00분(UTC)부터의 지금까지의 초단위의 시간을 알아볼 수 있습니다.

#include<stdio.h>
#include<time.h>

int main()
{
	time_t t;
	t = time(NULL);
	printf("%lld", t);

	return 0;
}

위처럼 특정 시간을 기준으로 초단위 시간을 알아볼 수 있습니다. 하지만 실제로 우리가 사용하기에는 상당히 불편한 부분이 있습니다. 이를 잘 사용하기 위해서 다양한 기능을 C언에서는 제공해줍니다.

 

tm 구조체

구조체를 이용해서 C언어에서는 시간을 년/일/월/시/분/초로 새 분화하여 나눠줄 수 있습니다. 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
};

 

localtime() 함수를 통해 tm 구조체에 시간 데이터 넣기

localtime() 함수와 위에서 알아본 내용들을 통해 효율적으로 시간을 표시하고 사용할 수 있습니다.

우선, locatime() 함수의 원형은 다음과 같습니다.

struct tm* localtime(const time_t* pTime)
  • 매개변수 : time_t 포인터 값
  • 반환 값 : tm구조체

즉 내부에서 어떠한 초단위 시간 값의 포인터 변수를 받아 데이터를 tm구조체 포인터에 삽입을 해주는 함수입니다.

실제 사용해본다면 다음과 같습니다.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>

int main()
{
	time_t orgtime; // 시간을 담을 자료형 변수 선언 
	struct tm* pTimeData; // tm구조체 포인터 생성

	orgtime = time(NULL); // 1970년 1월 1일 0시 00분 (UTC)을 저장
	pTimeData = localtime(&orgtime); // 저장한 시간을 구조체에 저장

	printf("pTimeData의 년 : %d\n", pTimeData->tm_year);
	printf("pTimeData의 월 : %d\n", pTimeData->tm_mon);
	printf("pTimeData의 일 : %d\n", pTimeData->tm_mday);
	printf("pTimeData의 시 : %d\n", pTimeData->tm_hour);

	return 0;
}

결과를 보면 약간 의도한 결과와 차이가 있다고 보일 수 있습니다. 하지만 위의 구조체를 선언한 내용을 보면 

년도의 경우 1900년 이후부터의 경과한 시간 그리고 월의 경우 0-11로 표현을 하고 있습니다.

다시 한번 이를 고려해서 표현한다면 아래와 같습니다.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>

int main()
{
	time_t orgtime; // 시간을 담을 자료형 변수 선언 
	struct tm* pTimeData; // tm구조체 포인터 생성

	orgtime = time(NULL); // 1970년 1월 1일 0시 00분 (UTC)을 저장
	pTimeData = localtime(&orgtime); // 저장한 시간을 구조체에 저장

	printf("pTimeData의 년 : %d\n", pTimeData->tm_year+1900);
	printf("pTimeData의 월 : %d\n", pTimeData->tm_mon+1);
	printf("pTimeData의 일 : %d\n", pTimeData->tm_mday);
	printf("pTimeData의 시 : %d\n", pTimeData->tm_hour);

	return 0;
}

이런 식으로 우리가 원하는 것처럼 시간의 데이터를 삽입하고 표현하는 것이 가능해집니다!

 

시간 서식 함수 asctime()과 ctime()

 

우리가 다양한 일상생활에서 시간을 표현하는 다양한 방법들을 볼 수 있었을 것입니다.

예를 들어 다음과 같습니다.

OO년OO월OO일OO시OO분OO초

OO-OO-OO OO:OO:OO

C언어 프로그래밍에서 사용자가 직접 이러한 서식을 만들 수도 있지만, 기본적인 서식을 제공해주기도 합니다. 이 함수가 바로 asctime()과 ctime()입니다.

함수의 원형은 아래와 같습니다.

char* ctime(const time_t* pTime);
char* asctime(const struct tm* pTm);

함수의 원형을 보면 다음과 같은 결괏값을 예상할 수 있습니다.

  • 두 함수 모두 문자열(서식의 형태로 반환한다)
  • ctime의 경우 time_t 자료형 데이터를 인자로 받는다
  • asctime의 경우 tm구조체를 인자로 받는다.

그렇다면 한번 위의 함수를 사용해보겠습니다.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>

int main()
{
	time_t orgtime; // 시간을 담을 자료형 변수 선언 
	struct tm* pTimeData; // tm구조체 포인터 생성

	orgtime = time(NULL); // 1970년 1월 1일 0시 00분 (UTC)을 저장
	pTimeData = localtime(&orgtime); // 저장한 시간을 구조체에 저장
	printf("ctime함수를 사용 : %s\n",ctime(&orgtime));
	printf("asctime함수를 사용 : % s\n",asctime(pTimeData));
	return 0;
}

이처럼 C언어에서 시간을 다루기위한 기본적인 방법에 대하여 알아보았습니다.

728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :