<개인공부>/[C언어, C++]

[C언어/C++] 시간 관련함수에 대해서 (time, localtime, ctime, asctime)

BlockDMask 2020. 8. 24. 00:00
반응형

안녕하세요. 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 구조체

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 - [060] including leap second
    int tm_min;   // minutes after the hour - [059]
    int tm_hour;  // hours since midnight - [023]
    int tm_mday;  // day of the month - [131]
    int tm_mon;   // months since January - [011]
    int tm_year;  // years since 1900
    int tm_wday;  // days since Sunday - [06]
    int tm_yday;  // days since January 1 - [0365]
    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

결과

결과를 보면 시간이 잘 변환되어서 이쁘게 나오는걸 확인할 수 있습니다.
이렇게 localtime 함수를 이용해서 struct tm 구조체로 변경하면 쉽게 사용할 수 있지만, 년도 월 일 시간 분 초 등등 하나하나 접근해서 변수를 다뤄야 한다는 귀찮음이 존재합니다.

바로 그 귀찮음을 덜어줄 함수 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에 대해서 알아보았습니다.
감사합니다

반응형