컴퓨터/C
프로그래밍의 영역에서 시간의 개념은 상당히 중요합니다. 그리고 다양한 영역에서 사용됩니다. 본 포스트에서는 C언어에서 시간을 다루는 항목들을 제공해주는 time라이브러리를 알아보도록 하겠습니다.
time.h에는 time_t의 자료형을 제공해줍니다. time_t 자료형은 시간을 편리하게 정의하기 위해 만든 자료형입니다.
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언에서는 제공해줍니다.
구조체를 이용해서 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() 함수와 위에서 알아본 내용들을 통해 효율적으로 시간을 표시하고 사용할 수 있습니다.
우선, locatime() 함수의 원형은 다음과 같습니다.
struct tm* localtime(const time_t* pTime)
즉 내부에서 어떠한 초단위 시간 값의 포인터 변수를 받아 데이터를 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;
}
이런 식으로 우리가 원하는 것처럼 시간의 데이터를 삽입하고 표현하는 것이 가능해집니다!
우리가 다양한 일상생활에서 시간을 표현하는 다양한 방법들을 볼 수 있었을 것입니다.
예를 들어 다음과 같습니다.
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);
함수의 원형을 보면 다음과 같은 결괏값을 예상할 수 있습니다.
그렇다면 한번 위의 함수를 사용해보겠습니다.
#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언어에서 시간을 다루기위한 기본적인 방법에 대하여 알아보았습니다.
C 언어 - 버퍼와 scanf 함수 (다양한 에러의 원인과 해결법) (0) | 2021.11.29 |
---|---|
C 언어 - 버퍼(Buffer)의 개념과 이해 (0) | 2021.11.24 |
C 언어 - NULL (0) | 2021.09.30 |
C 언어 - 거품정렬 구현해보기 (0) | 2021.09.27 |
C 언어 - 난수의 생성(랜덤 번호) (0) | 2021.09.19 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet