C 날짜와 시간 함수

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

C 날짜와 시간 함수는 C 표준 라이브러리의 time.h 헤더 파일에 정의되어 있으며, 시간과 날짜를 얻고 조작하는 데 사용되는 함수들을 포함한다. 이 함수들은 1977년 PWB/UNIX 1.0의 date 시스템 명령에서 유래되었으며, 1989년 ANSI C 표준에 포함되었다. 주요 함수로는 프로그램 시작 후 경과된 CPU 시간을 반환하는 clock, 두 시간 값의 차이를 계산하는 difftime, 현재 시스템 시간을 반환하는 time 등이 있다. 또한, 시간 값을 문자열로 변환하거나, 캘린더 시간으로 변환하는 asctime, ctime, strftime, gmtime, localtime, mktime 등의 함수도 제공된다. 이 외에도 널 포인터, 초당 클럭 틱 수 등을 나타내는 상수와, 시간 저장을 위한 size_t, clock_t, time_t, timespec 등의 형식 정의, 그리고 날짜와 시간을 나타내는 tm 구조체를 포함한다.

C 날짜와 시간 함수
일반 정보
헤더 파일time.h
설명날짜 및 시간 정보를 다루는 함수와 데이터 구조를 제공한다.
함수
시간 접근 및 변환asctime() - tm 구조체를 문자열로 변환한다.
clock() - 프로세서 시간을 결정한다.
ctime() - time_t 값을 문자열로 변환한다.
difftime() - 두 time_t 값 사이의 차이를 계산한다.
gmtime() - time_t 값을 UTC 시간의 tm 구조체로 변환한다.
localtime() - time_t 값을 현지 시간의 tm 구조체로 변환한다.
mktime() - 현지 시간의 tm 구조체를 time_t 값으로 변환한다.
strftime() - tm 구조체를 사용자 정의 형식의 문자열로 변환한다.
strptime() - 문자열을 tm 구조체로 변환한다. (POSIX 확장)
time() - 현재 시간을 time_t 값으로 얻는다.
timespec_get() - 시스템의 고해상도 클럭에서 현재 달력 시간을 얻는다. (C11)
타입clock_t
time_t
struct tm
struct timespec (C11)
매크로CLOCKS_PER_SEC
TIME_UTC (C11)
참고 자료
표준ISO/IEC 9899:1999
관련 주제C 표준 라이브러리
📚 더 읽어볼만한 페이지
  • C 표준 라이브러리 - 파일 끝
    파일 끝(EOF)은 데이터 소스에서 더 이상 읽을 데이터가 없음을 나타내는 조건이다.
  • C 표준 라이브러리 - C 자료형
    C 자료형은 C 언어에서 데이터 형태를 정의하는 기본 요소로, 다양한 크기와 속성을 가진 산술, 부울 자료형과 구조체, 공용체 등을 제공하며, 컴파일러 및 시스템 아키텍처에 따라 크기와 동작 방식이 달라질 수 있다.
  • 시간 - 오전
  • 시간 - 과거
    과거는 이전에 일어난 일, 개인의 경험, 특정 시점 등을 의미하며, 찰스 디킨스의 소설에 등장하고, 철학, 학문 등 다양한 분야에서 연구되며, 교훈을 담고 있는 주제이다.

2. 역사

`strftime`에서 사용되는 형식 문자열은 1977년에 출시된 PWB/UNIX 1.0의 `date` 시스템 명령에서 기원한다. 1989년에는 `strftime` 및 기타 날짜 및 시간 함수를 포함하는 ANSI C 표준이 발표되었다.

3. 함수

`time.h`는 C 언어의 표준 라이브러리로, 시간과 날짜를 얻거나 조작하는 함수들을 포함하고 있다. 크게 시간 조작 함수와 형식 변환 함수로 나눌 수 있다.

👆
좌우로 밀어서 보기
함수설명
clock프로그램 시작 후 경과된 시간을 반환한다.
difftime두 시간 값의 차이를 초 단위로 계산한다.
time현재 시스템 시간을 반환한다.
asctimetm 구조체를 텍스트 표현으로 변환한다.
ctime`time_t` 값을 텍스트 표현으로 변환한다.
mktimetm 구조체를 `time_t` 형식으로 변환한다.
gmtime`time_t` 값을 협정 세계시(UTC)로 표현된 캘린더 시간으로 변환한다.
localtime`time_t` 값을 현지 시간으로 표현된 캘린더 시간으로 변환한다.
strftimetm 구조체를 사용자 지정 텍스트 표현으로 변환한다.


C 표준 라이브러리에서는 `clock_t`, `time_t` 등의 시간 관련 데이터 타입도 제공하며, `CLOCKS_PER_SEC`와 `TIME_UTC` 같은 상수도 정의되어 있다.

3.1. 시간 조작

* clock: 프로그램 시작 후 경과된 CPU 시간을 반환한다.
* difftime: 두 `time_t` 값 간의 차이를 초 단위로 계산한다.
* time: 현재 시스템 시간을 `time_t` 값으로 반환한다. (일반적으로 유닉스 에포크 이후 경과된 초)
* timespec_get (C11): 지정된 기준 시간에 기반한 캘린더 시간을 반환한다.

3.2. 형식 변환

* asctime (const struct tm * timeptr): timeptr이 가리키는 tm 구조체를 텍스트 표현으로 변환한다. (더 이상 사용되지 않음)
* ctime (const time_t * timer): time_t 값을 텍스트 표현으로 변환한다.
* strftime (char * ptr, size_t maxsize, const char * format, const struct tm * timeptr): tm 구조체를 사용자 지정 텍스트 표현으로 변환한다.
* strptime (const char *s, const char *format, struct tm *tm): 시간 정보를 포함하는 문자열을 tm 구조체로 변환한다.
* wcsftime (wchar_t *wcs, size_t maxsize, const wchar_t *format, const struct tm *timeptr): tm 구조체를 사용자 지정 와이드 문자열 텍스트 표현으로 변환한다.
* gmtime (const time_t * timer): time_t 값을 협정 세계시(UTC)로 표현된 캘린더 시간으로 변환한다.
* localtime (const time_t * timer): time_t 값을 현지 시간으로 표현된 캘린더 시간으로 변환한다.
* mktime (struct tm * timeptr): 캘린더 시간을 time_t 값으로 변환한다.

4. 변수, 상수 및 형식

C 날짜 및 시간 연산은 `time.h` 헤더 파일(C++의 `ctime` 헤더)에 정의되어 있다.

👆
좌우로 밀어서 보기
이름설명
NULL널 포인터를 나타내는 상수로, 메모리의 어떤 유효한 위치의 개체도 가리키지 않는 포인터 값이다.
CLOCKS_PER_SEC초당 ms 수(=1000)이다.
size_tsizeof 연산자의 결과값을 나타내는 정수형이다.
clock_t프로세스 실행 시간을 나타내는 형식이다.
time_tUTC 1970년 1월 1일 0시 0분 0초(유닉스 에포크)를 기준으로 하는 초 단위의 시간을 저장하는 형식이다.
timespec초 및 나노초 단위의 시간을 나타내는 형식이다. (C11)

4.1. 상수

* NULL: 널 포인터를 나타내는 상수로, 메모리의 어떤 유효한 위치의 개체도 가리키지 않는 포인터 값이다.
* CLOCKS_PER_SEC: 초당 프로세서 클럭 틱 수를 나타낸다.
* TIME_UTC: 협정 세계시(UTC)에 대한 시간 기준이다. (C11)

4.2. 형식 정의

👆
좌우로 밀어서 보기
이름설명
size_tsizeof 연산자의 결과값을 나타내는 정수형이다.
clock_t프로세스 실행 시간을 나타내는 형식이다.
time_tUTC 1970년 1월 1일 0시 0분 0초(유닉스 에포크)를 기준으로 하는 초 단위의 시간을 저장하는 형식이다.
timespec초 및 나노초 단위의 시간을 나타내는 형식이다. (C11)

5. 구조체

tm 구조체는 날짜와 시간을 나타내는 구조체이다. time.h 헤더 파일(C++에서는 ctime 헤더)에 정의되어 있다.

tm 구조체의 멤버는 다음과 같다.

* tm_sec: 초 (0~59)
* tm_min: 분 (0~59)
* tm_hour: 시 (0~23)
* tm_mday: 일 (1~31)
* tm_mon: 월 (0~11)
* tm_year: 년 (1900년 기준)
* tm_wday: 요일 (일요일부터 시작, 0~6)
* tm_yday: 연중 일자 (0~365)
* tm_isdst: 서머타임 설정 여부

6. 예제

다음은 현재 시간을 표준 출력 스트림에 출력하는 C 소스 코드이다.

```c
#include
#include
#include

int main(void)
{
time_t current_time;
char* c_time_string;

/* 현재 시간 얻기 */
current_time = time(NULL);

if (current_time == ((time_t)-1))
{
(void) fprintf(stderr, "현재 시간을 얻는 데 실패했습니다.\n");
exit(EXIT_FAILURE);
}

/* 현지 시간 형식으로 변환 */
c_time_string = ctime(¤t_time);

if (c_time_string == NULL)
{
(void) fprintf(stderr, "현재 시간을 변환하는 데 실패했습니다.\n");
exit(EXIT_FAILURE);
}

/* stdout에 출력합니다. ctime()은 이미 줄 바꿈 문자를 추가했습니다. */
(void) printf("현재 시간은 %s", c_time_string);
exit(EXIT_SUCCESS);
}
```

출력은 다음과 같다.

```
Current time is Thu Sep 15 21:18:23 2016