[C언어/C++] 현재 날짜/시간 원하는 형태로 출력하기 (time, localtime)

개발을 하다 보면 현재 날짜나 현재시간이 필요할 경우가 생깁니다. 이번 포스팅에서는 C언어나 C++에서 현재 날짜, 현재시간을 어떻게 구할 수 있는지에 대해 포스팅하도록 하겠습니다.

 

1. time 헤더 파일 포함

#include <time.h> //C언어
#include <ctime> //C++

현재시간을 구하는 time 함수는 C언어는 <time.h>, C++ 일 경우에는 <ctime> 헤더 파일 안에 내장되어 있습니다.

 

2. time() 함수를 호출하여 현재의 날짜, 시간을 얻어 time_t 변수에 저장

time_t timer = time(NULL);

time 함수는 time_t 결과값으로 타입을 리턴합니다. 결과값은 Unix 운영체제가 공식 출시한 1970년 1월 1일 0시 0분 0초를 기점으로 현재까지 흐른 시간을 초단위로 나타냅니다.

 

3. localtime() 함수를 호출하여 포맷 변환하기

struct tm* t = localtime(&timer);

time 함수가 리턴해주는 값은 시스템에 따라 32비트나 64비트 정수입니다. 이를 그대로 사용하기에는 무리가 있겠죠. 따라서 사용하고자 하는 형태에 맞게끔 포맷팅을 해주어야 합니다. 이 과정을 localtime 함수를 사용하여 tm 구조체를 활용, 원하는 형태로 변환합니다.

 

struct tm 구조체

struct tm {
   int tm_sec;         // 초,  range 0 to 59      
   int tm_min;         // 분, range 0 to 59             
   int tm_hour;        // 시간, range 0 to 23  
   int tm_mday;        // 일, range 1 to 31  
   int tm_mon;         // 월, range 0 to 11     
   int tm_year;        // 1900년 부터의 년                
   int tm_wday;        // 요일, range 일(0) to 토(6) 
   int tm_yday;        // 1년 중 경과 일, range 0 to 365 
   int tm_isdst;       // 섬머타임 실시 여부 (양수, 0, 음수)              
};

시간 구조체는 위와 같이 정의되어 있습니다. 여기서 주의할 점은 tm_year과 tm_mon의 사용법입니다. tm_year은 1900년도부터의 년이기에 출력하고 싶은 년도를 1900년도에 +해서 사용해야 하고 tm_mon은 1월부터 12월까지 출력하기 위해서는 +1을 해서 사용하여야 합니다.

 

시간 출력 예제

#define _CRT_SECURE_NO_WARNINGS // 혹은 localtime_s를 사용
#include <stdio.h>
#include <time.h>

int main() {
    time_t timer;
    struct tm* t;
    timer = time(NULL); // 1970년 1월 1일 0시 0분 0초부터 시작하여 현재까지의 초
    t = localtime(&timer); // 포맷팅을 위해 구조체에 넣기
    
    printf("유닉스 타임 (Unix Time): %lld 초\n\n", timer); 
    printf("현재 년: %d\n", t->tm_year + 1900);
    printf("현재 월: %d\n", t->tm_mon + 1);
    printf("현재 일: %d\n", t->tm_mday);
    printf("현재 시: %d\n", t->tm_hour);
    printf("현재 분: %d\n", t->tm_min);
    printf("현재 초: %d\n", t->tm_sec);
    printf("현재 요일: %d\n", t->tm_wday); // 일=0, 월=1, 화=2, 수=3, 목=4, 금=5, 토=6
    printf("올해 몇 번째 날: %d\n", t->tm_yday); // 1월 1일은 0, 1월 2일은 1
    printf("서머타임 적용 여부: %d\n", t->tm_isdst); // 실시 중이면 양수, 미실시면 0, 실시 정보가 없으면 음수
    
    return 0;
}

 

현재 시간 밀리초, 나노초 단위로 구하기

time함수는 현재 시간을 초 단위까지만 구할 수 있습니다. 좀 더 정밀한 해상도를 원하신다면 아래 글들을 참고해주세요.

[C언어/C++] 정밀한 시간 측정 (clock, getTickcount, timeGetTime) 함수의 차이와 사용법

[C++] 나노초(ns)단위 시간 측정 chrono 함수 사용법 & 예제

댓글(0)

Designed by JB FACTORY