개발을 하다 보면 현재 날짜나 현재시간이 필요할 경우가 생깁니다. 이번 포스팅에서는 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) 함수의 차이와 사용법
'Language > C , C++ , C#' 카테고리의 다른 글
[C언어/C++] 구조체, 클래스의 패딩 바이트에 대하여 (1) | 2021.02.08 |
---|---|
[C언어/C++] 두개의 날짜/시간 간격 차이 계산하기 (difftime) (0) | 2021.02.07 |
[C언어/C++] 랜덤(rand)함수 활용 아이템 가챠 프로그램 (난수 생성) (0) | 2021.02.05 |
[C언어/C++] 랜덤함수(rand, srand, time) 사용법 & 예제 (난수 생성) (1) | 2021.02.05 |