C 날짜와 시간 함수
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 구조체를 포함한다.
| 헤더 파일 | 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 | 현재 시스템 시간을 반환한다. |
| asctime | tm 구조체를 텍스트 표현으로 변환한다. |
| ctime | `time_t` 값을 텍스트 표현으로 변환한다. |
| mktime | tm 구조체를 `time_t` 형식으로 변환한다. |
| gmtime | `time_t` 값을 협정 세계시(UTC)로 표현된 캘린더 시간으로 변환한다. |
| localtime | `time_t` 값을 현지 시간으로 표현된 캘린더 시간으로 변환한다. |
| strftime | tm 구조체를 사용자 지정 텍스트 표현으로 변환한다. |
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_t | sizeof 연산자의 결과값을 나타내는 정수형이다. |
| clock_t | 프로세스 실행 시간을 나타내는 형식이다. |
| time_t | UTC 1970년 1월 1일 0시 0분 0초(유닉스 에포크)를 기준으로 하는 초 단위의 시간을 저장하는 형식이다. |
| timespec | 초 및 나노초 단위의 시간을 나타내는 형식이다. (C11) |
4.1. 상수
* NULL: 널 포인터를 나타내는 상수로, 메모리의 어떤 유효한 위치의 개체도 가리키지 않는 포인터 값이다.
* CLOCKS_PER_SEC: 초당 프로세서 클럭 틱 수를 나타낸다.
* TIME_UTC: 협정 세계시(UTC)에 대한 시간 기준이다. (C11)
4.2. 형식 정의
| 이름 | 설명 |
|---|---|
| size_t | sizeof 연산자의 결과값을 나타내는 정수형이다. |
| clock_t | 프로세스 실행 시간을 나타내는 형식이다. |
| time_t | UTC 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