사용범위
Windows, Unix 등 모든 OS에서 사용가능한 표준 API 함수
기능
C언어 표준 함수로 1970-01-01 00:00:00 이후 현재까지의 시간을 초단위로 계산한다.
헤더
#include <time.h>
※ 함수 사용 시 time.h 파일을 include 하지 않는다면 컴파일 시 error 발생 ※
함수
time_t time(time_t* _Time);
파라미터
- time_t* _Time
- time 함수의 반환값을 저장할 time_t 변수의 주소값을 입력한다.
- NULL을 넣을 경우 파라미터는 무시하고 time 함수의 결과가 반환(return)된다.
반환값
성공시 1970-01-01 00:00:00 이후 현재까지의 시간을 초 단위로 반환한다.
파라미터가 NULL이 아닐 경우 입력한 파라미터에도 값을 반환해 준다.
실패시 -1 이 반환된다.
잡학지식
time_t 타입은 여러 플랫폼마다 다르게 정의된다.
C 표준에 의하면 time_t 타입은 부호가 있는 정수로 규정되어 있으므로 long, long long, int64_t, __time64_t 등으로 정의될 수 있는 것이다.
이로 인해 환경에 따라 크기가 변하는 long 타입이 time_t 정의에 포함되어 한 가지 문제가 발생할 수 있다.
부호 있는 4byte 정수의 범위는 –2,147,483,648 ~ 2,147,483,647 인데 time 함수는 1970-01-01 00:00:00 이후 현재까지의 시간을 초단위로 계산하기 때문이다.
time 함수가 표현 가능한 부호 있는 4byte 정수의 최대 크기인 2,147,483,647 은 2038년 1월 19일 03시 14분 07초이며 이 이후 시간이 지날 경우 오버플로우 버그가 발생하게 된다. (이를 Y2K38 문제라고 말한다.)
따라서 부호 있는 4byte 정수형으로 time함수를 사용하는 프로그램의 경우 2038년이 오기 전에 프로그램 코드 점검을 진행해야 한다. (time_t 타입은 time 함수 외에도 여러 API에서 사용된다.)
time 함수는 시스템 시간에 의존성이 있으므로 개발자는 이 부분을 반드시 숙지하고 사용해야 하며, 실패할 가능성이 있기 때문에 return 값(-1)과 errno를 확인하는 것이 좋다. (사실 실패할 확률은 희박하지만 개발자는 성공 확률이 99.9%라도 0.1%의 예외를 대응하는 일이 빈번하다.)
이로 인해 시스템 시간이 잘못되어 있는 경우 혹은 시스템의 시간 정보를 얻어오는데 필요한 권한이 없는 경우 등 여러 상황에서 실패할 수 있다.
추가로 당연한(?) 말이지만 인자로 넘긴 _Time의 주소값이 잘못된 경우 SIGSEGV도 발생할 수 있으니 주의해야 한다.
<소스 코드>
#include <stdio.h>
#include <time.h>
int main() {
time_t t, t2;
t = time(&t2);
printf("[time] t[%ld], t2[%ld]\n", t, t2);
return 0;
}
※ 실행 결과
[time] t[1681472788], t2[1681472788]
time 함수를 통해 나온 시간을 쉽게 확인할 수 있는 방법은 여러 가지가 있는데 그중 하나를 공유하자면 인터넷 창에서 확인하는 방법이다.
인터넷 브라우저 창을 하나 열어서 F12를 누르고 콘솔에 들어가면 코드를 입력하는 창이 하나 나오게 된다.
그리고 코드에서 나온 시간 숫자값에 1000을 곱해서 아래와 같이 입력해 본다.
new Date(1681472788000)
이후 결과를 확인하면 된다.