Namespaces
Variants

strftime

출처: ko.cppreference.net
< C | chrono
헤더 <time.h>
size_t strftime( char* str, size_t count,
                 const char* format, const struct tm* tp );
(C99까지)
size_t strftime( char* restrict str, size_t count,
                 const char* restrict format, const struct tm* restrict tp );
(C99부터)

주어진 달력 시간 tp의 날짜 및 시간 정보를 널 종료 멀티바이트 문자 문자열 str로 변환합니다. 이 변환은 형식 문자열 format에 따라 수행됩니다. 최대 count 바이트가 기록됩니다.

매개변수

str - 출력용 char 배열의 첫 번째 요소를 가리키는 포인터
count - 기록할 최대 바이트 수
format - 변환 형식을 지정하는 널 종료 멀티바이트 문자 문자열을 가리키는 포인터변환 형식
tp - 형식화할 시간을 지정하는 struct tm 객체를 가리키는 포인터

형식 문자열

형식 문자열은 0개 이상의 변환 지정자와 일반 문자(% 제외)로 구성됩니다. 종료 널 문자를 포함한 모든 일반 문자는 수정 없이 출력 문자열에 복사됩니다. 각 변환 사양은 % 문자로 시작하며, 선택적으로 E 또는 O 수정자가 뒤따르고(로케일에서 지원하지 않으면 무시됨), 그다음에 지정자의 동작을 결정하는 문자가 옵니다. 다음 형식 지정자를 사용할 수 있습니다:

변환
지정자
설명 사용된 필드
% 리터럴 %을(를) 기록합니다. 전체 변환 사양은 %%이어야 합니다.
n
(C99)
개행 문자를 기록합니다
t
(C99)
수평 탭 문자를 기록합니다
연도
Y 연도를 십진수로 기록합니다(예: 2017) tm_year
EY
(C99)
연도를 대체 표현으로 기록합니다(예: ja_JP 로케일에서 2011년 대신 平成23년) tm_year
y 연도의 마지막 두 자리를 십진수로 기록합니다(범위 [00,99]) tm_year
Oy
(C99)
연도의 마지막 두 자리를 대체 숫자 체계를 사용하여 기록합니다(예: ja_JP 로케일에서 11 대신 十一) tm_year
Ey
(C99)
연도를 로케일의 대체 달력 기간 %EC으로부터의 오프셋으로 기록합니다(로케일 종속) tm_year
C
(C99)
연도의 처음 두 자리를 십진수로 기록합니다(범위 [00,99]) tm_year
EC
(C99)
기준 연도(기간)의 이름을 로케일의 대체 표현으로 기록합니다(예: ja_JP에서 平成(헤이세이 시대)) tm_year
G
(C99)
ISO 8601 주 기준 연도를 기록합니다. 즉, 지정된 주를 포함하는 연도입니다.

ISO 8601에서 주는 월요일에 시작하며, 연도의 첫 번째 주는 다음 요구 사항을 충족해야 합니다:

  • 1월 4일 포함
  • 연도의 첫 번째 목요일 포함
tm_year, tm_wday, tm_yday
g
(C99)
ISO 8601 주 기준 연도의 마지막 두 자리를 기록합니다. 즉, 지정된 주를 포함하는 연도입니다(범위 [00,99]).

ISO 8601에서 주는 월요일에 시작하며, 연도의 첫 번째 주는 다음 요구 사항을 충족해야 합니다:

  • 1월 4일 포함
  • 연도의 첫 번째 목요일 포함
tm_year, tm_wday, tm_yday
월
b 약식 월 이름을 기록합니다(예: Oct)(로케일 종속) tm_mon
Ob
(C23)
약식 월 이름을 로케일의 대체 표현으로 기록합니다 tm_mon
h
(C99)
b tm_mon
B 의 동의어전체 월 이름을 기록합니다(예: October)(로케일 종속) tm_mon
OB
(C23)
적절한 전체 월 이름을 로케일의 대체 표현으로 기록합니다 tm_mon
m 월을 십진수로 기록합니다(범위 [01,12]) tm_mon
Om
(C99)
월을 대체 숫자 체계를 사용하여 기록합니다(예: ja_JP 로케일에서 12 대신 十二) tm_mon
주
U 연중 주를 십진수로 기록합니다(일요일이 주의 첫 번째 날)(범위 [00,53]) tm_year, tm_wday, tm_yday
OU
(C99)
연중 주를 %U과 같이 기록하며, 대체 숫자 체계를 사용합니다(예: ja_JP 로케일에서 52 대신 五十二) tm_year, tm_wday, tm_yday
W 연중 주를 십진수로 기록합니다(월요일이 주의 첫 번째 날)(범위 [00,53]) tm_year, tm_wday, tm_yday
OW
(C99)
연중 주를 %W과 같이 기록하며, 대체 숫자 체계를 사용합니다(예: ja_JP 로케일에서 52 대신 五十二) tm_year, tm_wday, tm_yday
V
(C99)
ISO 8601 연중 주를 기록합니다(범위 [01,53]).

ISO 8601에서 주는 월요일에 시작하며, 연도의 첫 번째 주는 다음 요구 사항을 충족해야 합니다:

  • 1월 4일 포함
  • 연도의 첫 번째 목요일 포함
tm_year, tm_wday, tm_yday
OV
(C99)
연중 주를 %V과 같이 기록하며, 대체 숫자 체계를 사용합니다(예: ja_JP 로케일에서 52 대신 五十二) tm_year, tm_wday, tm_yday
연중 일/월중 일
j 연중 일을 십진수로 기록합니다(범위 [001,366]) tm_yday
d 월중 일을 십진수로 기록합니다(범위 [01,31]) tm_mday
Od
(C99)
0부터 시작하는 월중 일을 대체 숫자 체계를 사용하여 기록합니다(예: ja_JP 로케일에서 27 대신 二十七)

한 문자 앞에 공백이 옵니다.

tm_mday
e
(C99)
월중 일을 십진수로 기록합니다(범위 [1,31]).

한 자리 숫자 앞에 공백이 옵니다.

tm_mday
Oe
(C99)
1부터 시작하는 월중 일을 대체 숫자 체계를 사용하여 기록합니다(예: ja_JP 로케일에서 27 대신 二十七)

한 문자 앞에 공백이 옵니다.

tm_mday
요일
a 약식 요일 이름을 기록합니다(예: Fri)(로케일 종속) tm_wday
A 전체 요일 이름을 기록합니다(예: Friday)(로케일 종속) tm_wday
w 요일을 십진수로 기록합니다. 일요일은 0입니다(범위 [0-6]) tm_wday
Ow
(C99)
요일을 기록합니다. 일요일은 0이며, 대체 숫자 체계를 사용합니다(예: ja_JP 로케일에서 2 대신 二) tm_wday
u
(C99)
요일을 십진수로 기록합니다. 월요일은 1입니다(ISO 8601 형식)(범위 [1-7]) tm_wday
Ou
(C99)
요일을 기록합니다. 월요일은 1이며, 대체 숫자 체계를 사용합니다(예: ja_JP 로케일에서 2 대신 二) tm_wday
시, 분, 초
H 시를 십진수로 기록합니다. 24시간제(범위 [00-23]) tm_hour
OH
(C99)
시를 24시간제에서 대체 숫자 체계를 사용하여 기록합니다(예: ja_JP 로케일에서 18 대신 十八) tm_hour
I 시를 십진수로 기록합니다. 12시간제(범위 [01,12]) tm_hour
OI
(C99)
시를 12시간제에서 대체 숫자 체계를 사용하여 기록합니다(예: ja_JP 로케일에서 06 대신 六) tm_hour
M 분을 십진수로 기록합니다(범위 [00,59]) tm_min
OM
(C99)
분을 대체 숫자 체계를 사용하여 기록합니다(예: ja_JP 로케일에서 25 대신 二十五) tm_min
S 초를 십진수로 기록합니다(범위 [00,60]) tm_sec
OS
(C99)
초를 대체 숫자 체계를 사용하여 기록합니다(예: ja_JP 로케일에서 24 대신 二十四) tm_sec
기타
c 표준 날짜 및 시간 문자열을 기록합니다(예: Sun Oct 17 04:41:13 2010)(로케일 종속) 모두
Ec
(C99)
대체 날짜 및 시간 문자열을 기록합니다(예: ja_JP 로케일에서 2011년 대신 平成23년 사용) 모두
x 지역화된 날짜 표현을 기록합니다(로케일 종속) 모두
Ex
(C99)
대체 날짜 표현을 기록합니다(예: ja_JP 로케일에서 2011년 대신 平成23년 사용) 모두
X 지역화된 시간 표현을 기록합니다(예: 18:40:20 또는 오후 6:40:20)(로케일 종속) 모두
EX
(C99)
대체 시간 표현을 기록합니다(로케일 종속) 모두
D
(C99)
"%m/%d/%y" tm_mon와 동일, tm_mday, tm_year
F
(C99)
"%Y-%m-%d"와 동일(ISO 8601 날짜 형식) tm_mon, tm_mday, tm_year
r
(C99)
지역화된 12시간제 시간을 기록합니다(로케일 종속) tm_hour, tm_min, tm_sec
R
(C99)
"%H:%M" tm_hour과 동일, tm_min
T
(C99)
"%H:%M:%S"와 동일(ISO 8601 시간 형식) tm_hour, tm_min, tm_sec
p 지역화된 오전 또는 오후를 기록합니다(로케일 종속) tm_hour
z
(C99)
UTC로부터의 오프셋을 ISO 8601 형식으로 기록합니다(예: -0430). 시간대 정보를 사용할 수 없으면 문자를 기록하지 않습니다. tm_isdst
Z 로케일 종속적인 시간대 이름 또는 약어를 기록합니다. 시간대 정보를 사용할 수 없으면 문자를 기록하지 않습니다. tm_isdst

반환값

성공 시 str이 가리키는 문자 배열에 기록된 바이트 수(종료 '\0' 제외)입니다. 전체 문자열을 저장하기 전에 count에 도달하면 0이 반환되고 내용은 결정되지 않습니다.

예제

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

int main(void)
{
    char buff[70];
    struct tm my_time =
    {
        .tm_year = 112, // = year 2012
        .tm_mon = 9,    // = 10th month
        .tm_mday = 9,   // = 9th day
        .tm_hour = 8,   // = 8 hours
        .tm_min = 10,   // = 10 minutes
        .tm_sec = 20    // = 20 secs
    };

    if (strftime(buff, sizeof buff, "%A %c", &my_time))
        puts(buff);
    else
        puts("strftime failed");

    setlocale(LC_TIME, "el_GR.utf8");

    if (strftime(buff, sizeof buff, "%A %c", &my_time))
        puts(buff);
    else
        puts("strftime failed");
}

가능한 출력:

Sunday Sun Oct  9 08:10:20 2012
Κυριακή Κυρ 09 Οκτ 2012 08:10:20 πμ EST

참조

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.27.3.5 strftime 함수 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.27.3.5 strftime 함수 (p: 288-291)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.27.3.5 strftime 함수 (p: 394-397)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.23.3.5 strftime 함수 (p: 343-347)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.12.3.5 strftime 함수

같이 보기

(C23에서 폐지됨)(C11)
tm 객체를 텍스트 표현으로 변환합니다
(함수)
(C23에서 폐지됨)(C11)
time_t 객체를 텍스트 표현으로 변환합니다
(함수)
tm 객체를 사용자 정의 와이드 문자열 텍스트 표현으로 변환합니다
(함수)
C++ 문서 for strftime