안녕하세요. BlockDMask 입니다.
오늘은 C언어<time.h> C++에 <ctime> 헤더 파일에 대해서 알아보려고 합니다.
시간을 다루는 함수들이 이 헤더 파일 안에 존재하는데요. 시간 관련 함수들 time(), localtime(), ctime(), asctime() 함수에 대해서 알아볼 예정이고, time_t 타입과 tm 구조체에 대해서 전반적으로 한번 살펴보려고 합니다.
조금 복잡할 수 있기 때문에 최대한 간단하게 설명하고 간단한 예제로 작성해보려 합니다.
그럼 시작해보겠습니다.
<목차>
1. time_t 타입과 tm 구조체 설명과 예제
2. time() 함수 설명과 예제
3. localtime() 함수 설명과 예제
4. ctime(), asctime() 함수 설명과 예제
1. time_t 타입과 struct tm 에 대해서
1-1) time_t 타입
time_t는 time 헤더에서 시간을 잘 다루기 위해서 만들어진 데이터 타입 입니다.
이따가 보시겠지만 time() 이라는 함수의 반환형으로써 time() 함수가 어떠한 기준에 의한 시간데이터를 반환하고 그 시간을 다루기 위해서 사용하는 데이터 타입 입니다.
이 값은 32, 64비트 정수값으로 표현이 되며, 일반적으로 1970년 1월 1일 00:00 UTC (유닉스 타임)이후 경과된 초(정수값)를 나타냅니다.
다시 정리하면 1970년 1월 1일 00시 00분(UTC) 부터 지금까지 초단위의 시간을 정수값으로 표현하는 데이터 입니다.
코드에서 한번 볼까요?
1 2 3 4 5 6 7 8 9 | #include<stdio.h> #include<time.h> int main(void) { time_t t; // time_t 타입 t = time(NULL); // time() 함수를 통해서 현재 시간 반환 printf("%lld", t); // 출력 return 0; } | cs |
결과
위 처럼 우리가 알아 볼 수 없는 숫자가 나옵니다. 이게 바로 초단위 시간의 정수값입니다. 이 숫자를 우리는 가공을해서 현재 시간을 구할 수 있습니다.
일단 time_t에 대해서는 알았으니, 아래로 쭉쭉 가면서 어떤식으로 가공을 하는지 알아보겠습니다.
1-2) tm 구조체
위에서 본 time_t가 조금 불친절했더라면, tm 구조체는 매우 친절한 친구 입니다.
아래 구조체를 보시면 모두 세세하게 나눠져 있는것을 볼 수 있습니다.
아래 tm 구조체에 대해서 한번 볼까요?
1 2 3 4 5 6 7 8 9 10 11 12 | 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 }; | cs |
이렇게 보면 "[]" 개구간으로 표현이 되어있습니다. 이것은 끝에 있는 숫자도 포함을 한다는 의미이겠죠?
'분'을 나타내는 변수 tm_min를 보면 0분를 포함해서 59분까지 표현을 하는 정수로 사용할 것이다. 라고 주석이 쓰여있습니다.
그런데 조금 알아두어야할 부분이 두 부분이 있습니다.
- '월'을 나타내는 tm_mon을 보면 0~11 입니다. 즉 0월에서 11월까지라는거죠. 총 12개 이기 때문에 우리는 tm_mon을 사용할때는 +1을 해서 사용하면 1월부터 12월까지 표현할 수 있습니다.
- '연도'를 나타내는 tm_year을 보면 years since 1900이라고 나와있습니다. 즉 "tm_year은 1900년도부터 숫자를 나타낼꺼니까 니가 현재 연도를 가지고 오려면 1900년도를 더해서 사용해라." 이런 뜻입니다. 식으로 나타내면 이렇게 되겠죠? "현재 연도 = tm_year + 1900"
이렇게 총 9개의 변수가 각각 표현하는 값이 다릅니다. 이 값들만 있으면 간단히 달력도 만들수 있겠죠?
이부분은 딱 보면 다 나오기 때문에 따로 설명하지 않겠습니다.
2. time() 함수 설명과 예시
time 함수의 원형을 먼저 살펴보겠습니다.
time_t time(time_t *pTime)
반환형 : time_t 데이터 타입.
매개변수 : time_t 의 포인터 타입.
설명 : time 함수는 1970년 1월 1일 0시(UTC)부터 현재까지 흐른 시간을 time_t 타입(초단위 정수)로 반환을 합니다.
함수를 사용하는 방법은 두가지가 존재합니다. 매개변수에 NULL을 집어 넣어서 반환형으로 시간을 받는 방법과 매개변수 time_t*에 변수 time_t 를 참조하여 값을 얻어오는 방법이 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include<stdio.h> #include<time.h> int main(void) { time_t t1; time(&t1); printf("%lld\n", t1); time_t t2; t2 = time(NULL); printf("%lld\n", t2); return 0; } | cs |
위 처럼 두가지 방법으로 현재시간을 얻을수 있으며, 같은 시간이 나오는것을 확인할 수 있습니다.
근데 이렇게 하면 우리는 알아볼 수가 없죠...
이걸 이쁘게 변환해서 구조체 tm 에 넣어주는 함수 localtime 을 한번 알아볼까요?
3. localtime() 함수 설명과 예시
localtime의 함수 원형부터 한번 보겠습니다.
struct tm* localtime(const time_t* pTime);
함수 설명 : 이 함수는 const time_t* 타입의 변수를 매개변수로 받고, 그 시간을 변환해서 tm에 딱딱 이쁘게 넣어서 반환해주는 그런 함수 입니다.
즉, 우리가 time() 함수 등으로 얻은 1970년 1월 1일 0시(UTC)부터 현재까지 시간의 초 정수를 localtime 함수가 struct tm에 년, 월, 일, 분, 초 등등의 값으로 알아서 변환해서 반환해주는 그런 착한 함수인 것 입니다.
time_t 을 넣으면 ===> struct tm 반환
localtime 예제를 한번 볼까요?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<time.h> int main(void) { time_t rawTime; struct tm* pTimeInfo; rawTime = time(NULL); // 현재 시간을 받음 pTimeInfo = localtime(&rawTime); // 현재 시간을 이쁘게 struct tm에 넣음 printf("time_t : %lld\n", rawTime); int year = pTimeInfo->tm_year + 1900; //연도에는 1900 더해줌 int month = pTimeInfo->tm_mon + 1; // 월에는 1 더해줌 int day = pTimeInfo->tm_mday; int hour = pTimeInfo->tm_hour; int min = pTimeInfo->tm_min; int sec = pTimeInfo->tm_sec; printf("timeInfo : %d년 %d월 %d일 %d시 %d분 %d초\n", year, month, day, hour, min, sec); return 0; } | cs |
결과
바로 그 귀찮음을 덜어줄 함수 ctime과 asctime함수가 바로 아래 존재합니다.
4. 시간을 좀더 쉽게 다루게 해주는 ctime과 asctime 함수
ctime 함수와 asctime함수는 동일한 기능을 하는 함수입니다. 단지 인자로 받는 매개변수의 타입이 다를 뿐 입니다.
우리가 위에서 시간을 다루는 time_t 데이터 타입과 구조체 tm에 대해서 알아보았는데요. ctime, asctime 함수는 그 시간들을 미리 문자열로 만들어 놓은 함수 입니다.
일단 함수들의 원형을 보고 예제로 바로 들어가시죠.
딱 보면 감이 오실거라서 길게 설명해봤자 입만, 아니 손만 아픕니다.
char* ctime(const time_t* pTime);
char* asctime(const struct tm* pTm);
위 함수 두개는 매개변수는 각각 다른 형태의 시간을 받지만 반환형은 같습니다.
매개변수로 받은 시간값을 파싱해서 아래와 같은 문자열로 반환합니다.
반환형 : "Www Mmm dd hh:mm:ss yyyy"
반환형 : "요일 월 일 시간:분:초 연도"
바로 예제를 보시죠
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<time.h> int main(void) { // 예제1 : time_t와 짝을 이루는 ctime 함수 time_t t1; time(&t1); char* str1 = ctime(&t1); printf("ctime의 결과 : %s\n", str1); // 예제2 : struct tm과 짝을 이루는 asctime 함수 struct tm* pTm; time_t t2; t2 = time(NULL); pTm = localtime(&t2); char* str2 = asctime(pTm); printf("asctime의 결과 : %s\n", str2); return 0; } | cs |
결과
이처럼 현재 시간이 잘 나오는 것을 확인 할 수 있습니다.
이상으로. C언어 C++에서 시간을 다루는 함수 time, localtime, ctime, asctime에 대해서 알아보았습니다.
감사합니다
'<개인공부> > [C언어, C++]' 카테고리의 다른 글
[C언어/C++] 삼각함수 sin, cos, tan 함수 설명 및 예제 (라디안 포함) (1) | 2020.11.26 |
---|---|
[C언어/C++] memmove 메모리 이동 함수 설명 및 예시 (0) | 2020.11.19 |
[C언어/C++] memcpy 메모리 복사 함수 설명 및 예시 (4) | 2020.11.12 |
[C언어/C++] memset 함수 메모리 초기화 (12) | 2020.11.05 |
[C언어/C++] fgets, fputs 함수에 대해서 (2) | 2020.06.22 |
[C언어/C++] fputc, fgetc 함수에 대해서 (0) | 2020.06.16 |
[C언어/C++] 파일 입출력 fopen, fclose 함수에 대해서 (1) | 2020.06.12 |
[C언어/C++] strtok 함수(문자열 자르기)에 대해서. (14) | 2020.03.31 |