Core Programming/C Standard Library: Resource & Performan

C언어 시간 포맷팅 완벽 가이드: strftime, localtime, gmtime 활용법

임베디드 친구 2025. 2. 23. 15:54
반응형

C언어 시간 변환과 포맷팅: strftime, gmtime, localtime 완벽 정리

C언어에서 time_t로 가져온 10진수 숫자를 사람이 읽을 수 있는 날짜 형식으로 바꾸려면 변환 함수가 필요합니다. 오늘은 세계 표준시(UTC)와 로컬 시간을 넘나드는 방법, 그리고 strftime을 이용해 예쁘게 시간을 출력하는 법을 알아보겠습니다.

Generated by Gemini AI.


1. 시간 변환의 흐름 이해하기

C언어에서 시간 데이터는 보통 아래와 같은 흐름으로 처리됩니다.

[time_t (초 단위)] $\rightarrow$ [struct tm (구조체)] $\rightarrow$ [문자열 (포맷팅)]

이 과정에서 gmtime과 localtime은 구조체로의 변환을, strftime은 문자열로의 변환을 담당합니다.


2. UTC vs 로컬 시간 (gmtime, localtime)

2.1 gmtime: 세계 표준시(UTC) 기준

그리니치 천문대 기준의 표준 시간을 가져옵니다. 서버 로그 기록이나 국제적인 데이터를 다룰 때 주로 사용합니다.

2.2 localtime: 시스템 로컬 기준

사용자의 PC나 서버가 설정된 지역(예: 한국 KST)의 시간대(Timezone)를 반영합니다.

C
 
#include <stdio.h>
#include <time.h>

int main() {
    time_t raw_time = time(NULL);
    struct tm *gmt = gmtime(&raw_time);
    struct tm *local = localtime(&raw_time);

    printf("UTC 기준: %02d:%02d\n", gmt->tm_hour, gmt->tm_min);
    printf("로컬 기준: %02d:%02d\n", local->tm_hour, local->tm_min);

    return 0;
}

3. strftime으로 자유롭게 포맷팅하기

printf로 하나씩 tm_year, tm_mon을 찍는 것은 번거롭습니다. strftime 함수를 쓰면 단 한 줄로 원하는 형태의 날짜 문자열을 만들 수 있습니다.

주요 포맷 지정자 요약

분류 지정자 의미 (예시)
연도 %Y, %y 2026, 26
월/일 %m, %d 05, 05
시간 %H, %M, %S 21, 39, 11 (24시간제)
요일 %A, %a Tuesday, Tue
월 이름 %B, %b May, May
기타 %p, %Z AM/PM, KST (타임존)

활용 예제 코드

C
 
#include <stdio.h>
#include <time.h>

int main() {
    time_t now = time(NULL);
    struct tm *t = localtime(&now);
    char buffer[100];

    // 형식: 2026-05-05 (Tue) 21:39:11 PM
    strftime(buffer, sizeof(buffer), "%Y-%m-%d (%a) %H:%M:%S %p", t);
    
    printf("현재 시간: %s\n", buffer);
    return 0;
}

4. 실무자를 위한 핵심 주의사항

⚠️ 정적 버퍼와 Thread-safe

gmtime과 localtime은 내부적으로 정적 메모리(Static Buffer)를 사용합니다. 즉, 함수를 한 번 더 호출하면 이전의 데이터가 덮어씌워질 수 있습니다.

  • 해결책: 값이 반환되자마자 다른 구조체 변수에 복사해두거나, 멀티스레드 환경이라면 localtime_r 또는 localtime_s와 같은 안전한 버전의 함수를 사용하는 것이 좋습니다.

⚠️ 연도와 월의 오프셋

이전 포스팅에서도 강조했듯이, tm_year는 +1900, tm_mon은 +1을 잊지 마세요! (strftime을 사용하면 이 계산을 자동으로 해주므로 훨씬 안전합니다.)


요약 및 정리

  1. 국제 표준이 필요하면 gmtime, 내 위치 기준이면 localtime.
  2. 사용자에게 보여줄 문자열을 만들 때는 strftime이 가장 효율적임.
  3. 멀티스레드 환경에서는 정적 버퍼 반환 방식을 주의할 것.

    포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!https://coding-by-head.tistory.com/
  4. 임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.
반응형