C Unix 타임스탬프 스니펫
현재 Unix 타임스탬프 가져오기, strftime()로 에포크 초를 읽기 쉬운 날짜로 변환, timegm()로 달력 날짜에서 타임스탬프 구성하는 C 예제.
#include <time.h>
time_t ts = time(NULL);#include <time.h>
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
long ms = (long)ts.tv_sec * 1000L + ts.tv_nsec / 1000000L;#include <time.h>
#include <stdio.h>
time_t ts = 1700000000;
struct tm *tm_info = gmtime(&ts); // UTC
char buf[64];
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm_info);
printf("%s\n", buf); // "2023-11-15 06:13:20"#include <time.h>
time_t ts = 1700000000;
struct tm *tm_info = localtime(&ts); // host timezone
char buf[64];
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm_info);#define _GNU_SOURCE
#include <time.h>
struct tm t = {0};
t.tm_year = 2023 - 1900; // years since 1900
t.tm_mon = 10; // 0-indexed; 10 = November
t.tm_mday = 15;
t.tm_hour = 6;
t.tm_min = 13;
t.tm_sec = 20;
time_t ts = timegm(&t); // GNU/POSIX; use mktime() for local#include <time.h>
time_t start = time(NULL);
/* ... work ... */
time_t end = time(NULL);
double elapsed = difftime(end, start);C 타임스탬프 기본
C는 Unix 시간을 <time.h>에 정의된 부호 있는 정수형 time_t로 표현합니다. 64비트 시스템에서 time_t는 64비트이며 2038년 오버플로에 영향을 받지 않습니다. 32비트 시스템에서는 많은 플랫폼에서 여전히 32비트입니다; 확인하려면 sizeof(time_t)를 점검하세요. 표준 함수 time(NULL)은 현재 Unix 시간을 초로 반환합니다.
gmtime 대 localtime
gmtime()은 time_t를 UTC의 struct tm으로 변환합니다. localtime()은 호스트 시스템의 현지 시간대로 변환합니다. 재현 가능하고 시간대에 독립적인 결과가 필요하면 항상 gmtime()을 사용하세요. 두 함수 모두 공유된 정적 struct에 대한 포인터를 반환합니다; 함수 호출 간에 필요하면 결과를 지역 struct tm 변수로 복사하세요.
C 운영 참고 사항
초 미만 정밀도에는 gettimeofday()보다 clock_gettime(CLOCK_REALTIME)을 선호하세요; POSIX는 gettimeofday()를 폐기 예정으로 표시합니다. 달력 날짜를 UTC 타임스탬프로 변환할 때는 timegm()(GNU/BSD)이나 이식 가능한 동등물을 사용하세요; mktime()은 입력을 현지 시각으로 해석하여 UTC가 아닌 환경에서 조용히 잘못된 결과를 냅니다.
- 임베디드 타깃에서는 sizeof(time_t)를 확인; 32비트 time_t는 2038년 1월에 되돌아감
- 멀티스레드 코드에서는 데이터 경합을 피하려고 gmtime_r()과 localtime_r()을 사용
- strftime() 형식 문자열은 로캘 독립적; 상호 운용성을 위해 %x보다 %Y-%m-%d를 선호
- timegm()은 POSIX에 없음; Windows에서는 _mkgmtime()을 쓰거나 mktime() + UTC 오프셋으로 수동 구현
Linux 시간 변환: date(1), time_t, gmtime, strftime
'convert linux time'이나 Linux 타임스탬프 변환 검색은 보통 셸 명령 date(1)이나 아래의 C 라이브러리 time_t 함수를 의미합니다. Linux는 Unix 타임스탬프를 time_t로 저장합니다 — 레거시 시스템에서는 부호 있는 32비트(Y2038 한계), 최신에서는 부호 있는 64비트.
- Shell (GNU date): date -u -d @1700000000 — epoch → UTC 일시
- Shell (BSD/macOS): date -ur 1700000000 — -d @ 대신 -r에 유의
- Shell 현재 epoch: date +%s(초), date +%s%3N(ms, GNU 전용)
- C 라이브러리: time_t t = time(NULL); struct tm *u = gmtime(&t); strftime(buf, sizeof(buf), '%Y-%m-%dT%H:%M:%SZ', u);
- C 라이브러리: timegm(struct tm *)은 UTC 달력 시각에 대한 time_t를 반환
- POSIX time_t: 부호 있는 32비트는 2038-01-19에 오버플로; 64비트 time_t가 최신 해결책
Linux epoch 시간, Linux 타임스탬프를 시각으로, 온라인 Linux 변환기
변형: 'linux epoch time'(Linux의 Unix 시간), 'linux timestamp to time'(epoch → 벽시계), 'linux timestamp converter online'(이 페이지).
- Linux epoch time / linux epoch time — Unix 시간과 동일; 현재 값: date +%s
- Linux timestamp to time / linux timestamp to time — date -u -d @1700000000은 UTC 벽시계 시각을 반환
- Linux timestamp converter online / linux timestamp converter online — 이 페이지는 date(1)의 브라우저 기반 동등물
FAQ
- C에서 Unix 타임스탬프에는 어떤 타입을 써야 하나?
- 초 정밀도에는 time_t를, 밀리초나 나노초를 저장해야 할 때는 int64_t(<stdint.h>)를 사용하세요. int나 long은 크기가 플랫폼에 따라 다르므로 피하세요.
- C에서 밀리초를 얻으려면?
- <time.h>의 clock_gettime(CLOCK_REALTIME, &ts)를 사용하세요. 결과는 ts.tv_sec(초)와 ts.tv_nsec(나노초)에 있습니다. 밀리초는 ts.tv_sec * 1000LL + ts.tv_nsec / 1000000으로 계산하세요.