strftime() — 날짜/시간을 스트링으로 변환

형식

#include <time.h>
size_t strftime(char *s, size_t maxsize, const char *format,
                   const struct tm *timeptr);

언어 레벨

ANSI

스레드세이프

로케일 감지

이 함수의 작동은 현재 로케일의 LC_CTYPE, LC_TIME, LC_TOD 범주로 영향을 받을 수 있습니다. 자세한 정보는 CCSID 및 로케일 이해의 내용을 참조하십시오.

설명

strftime() 함수는 format 으로 가리키는 스트링에서 제어하는 대로, s로 가리키는 배열에 바이트를 배치합니다. 형식 스트링은 0개 이상의 변환 스펙 및 보통 문자로 구성됩니다. 변환 스펙은 변환 작동을 판별하는 종료 변환 문자 및 % 문자로 구성됩니다. 종료 널 바이트 및 멀티바이트 문자를 포함하여 모든 보통 문자는 배열로 변경되지 않고 복사됩니다. 겹치는 오브젝트 사이에서 복사가 수행되면 작동은 정의되지 않습니다. maxsize 이하의 바이트가 배열에 배치됩니다. 적절한 문자는 timeptr 및 현재 로케일에 저장된 값으로 가리키는 구조에 포함된 값으로 판별됩니다.

각 표준 변환 스펙은 다음 표에서 설명한 대로 적절한 문자로 대체됩니다.

지정자 의미
%a 축약된 요일명.
%A 전체 요일명.
%b 축약된 월명.
%B 전체 월명.
%c 로케일 형식의 날짜/시간.
%C 세기 수[00-99]로 연도는 100으로 나누고 정수로 자릅니다.
%d 월의 일[01-31].
%D 날짜 형식(%m/%d/%y와 동일).
%e 한 자릿수가 공백으로 선행된다는 점을 제외하고 %d와 동일합니다[1-31].
%g ISO 주 날짜의 두 자리 연도 부분[00,99].
%F ISO 날짜 형식(%Y-%m-%d와 동일).
%G ISO 주 날짜의 네 자리 연도 부분. 음수일 수 있습니다.
%h %b와 동일합니다.
%H 24시간 형식의 시간[00-23].
%I 12시간 형식의 시간[01-12].
%j 연도의 일[001-366].
%m 월[01-12].
%M 분[00-59].
%n 줄 바꾸기 문자.
%p AM 또는 PM 스트링.
%r 로케일의 AM/PM 형식 시간. 로케일 시간 형식을 사용할 수 없는 경우 디폴트는 POSIX 시간 AM/PM 형식입니다(%I:%M:%S %p).
%R 초가 없는 24시간 형식(%H:%M과 동일).
%S 초[00-61]. 초의 범위는 윤초 및 이중 윤초를 허용합니다.
%t 탭 문자.
%T 초가 있는 24시간 형식(%H:%M:%S와 동일).
%u 요일[1,7]. 월요일은 1이고 일요일이 7입니다.
%U 연도의 주 번호[00-53]. 일요일은 첫 번째 요일입니다.
%V 연도의 ISO 주 번호[01-53]. 월요일은 첫 번째 요일입니다. 새 연도에 1월 1일을 포함하는 주가 4일 이상을 포함하면 주 1로 간주됩니다. 그렇지 않으면 작년의 마지막 주이고, 다음 연도는 새 연도의 주 1입니다.
%w 요일[0,6]. 일요일은 0입니다.
%W 연도의 주 번호[00-53]. 월요일은 첫 번째 요일입니다.
%x 로케일 형식의 날짜.
%X 로케일 형식의 시간.
%y 두 자리 연도[00,99].
%Y 4자리 연도. 음수일 수 있습니다.
%z UTC 오프셋. 출력은 형식 +HHMM 또는 -HHMM의 스트링입니다. 여기서 +는 GMT 동쪽, -는 GMT 서쪽을 의미합니다. HH는 GMT에서 시간 수를 나타내고 MM은 GMT에서의 분 수를 나타냅니다.
%Z 시간대명.
%% % 문자.

수정된 변환 지정자

일부 변환 지정자는 대체 형식 또는 스펙을 사용해야 함을 표시하도록 E 또는 0 수정자 문자로 수정할 수 있습니다. 또는 수정되지 않은 변환 지정자가 정상적으로 사용하는 항목 대신 스펙을 사용해야 합니다. 수정된 변환 지정자가 사용할 수 없는 현재 로케일의 필드를 사용하는 경우 작동은 수정하지 않은 변환 스펙을 사용한 경우와 같습니다. 예를 들어, era 스트링이 빈 스트링 ""인 경우(즉, 스트링을 사용할 수 없음) %EY는 %Y와 같이 작동합니다.

지정자 의미
%Ec 현재 시대의 날짜/시간.
%EC 시대명.
%Ex 현재 시대의 날짜.
%EX 현재 시대의 시간.
%Ey 시대의 연도. 기본 연도로부터의 오프셋입니다.
%EY 현재 시대의 연도.
%Od 대체 자릿수를 사용하는 월의 일.
%Oe %Od와 동일합니다.
%OH 대체 자릿수를 사용하는 24시간 형식의 시간.
%OI 대체 자릿수를 사용하는 12시간 형식의 시간.
%Om 대체 자릿수를 사용하는 월.
%OM 대체 자릿수를 사용하는 분.
%OS 대체 자릿수를 사용하는 초.
%Ou 대체 자릿수를 사용하는 요일. 월요일은 1이고 일요일이 7입니다.
%OU 대체 자릿수를 사용하는 연도의 주 번호. 일요일은 첫 번째 요일입니다.
%OV 대체 자릿수를 사용하는 연도의 ISO 주 번호. ISO 주 번호에 대한 설명은 %V를 참조하십시오.
%Ow 대체 자릿수를 사용하는 요일. 일요일은 0입니다.
%OW 대체 자릿수를 사용하는 연도의 주 번호. 월요일은 첫 번째 요일입니다.
%Oy 대체 자릿수를 사용하는 두 자리 연도.
%OZ 시간대가 현재 로케일에 존재하면 %Z와 동일합니다. 그렇지 않으면 현재 작업의 축약된 시간대명이 리턴됩니다.
참고: %C, %D, %e, %h, %n, %r, %R, %t, %T, %u, %V, 수정된 변환 지정자는 LOCALETYPE(*CLD)이 컴파일 명령에 지정된 경우 사용할 수 없습니다.

리턴값

종료 널 바이트를 포함하는 총 결과 바이트 수가 maxsize 이하인 경우 strftime()은 종료 널 바이트를 포함하지 않고 s로 가리키는 배열에 배치된 바이트 수를 리턴합니다. 그렇지 않으면 0이 리턴되고 배열의 컨텐츠는 불확실합니다.

변환 오류가 발생하면 errnoECONVERT로 설정될 수 있습니다.

#include <stdio.h>
#include <time.h>
 
int main(void)
{
     char s[100];
     int rc;
     time_t temp;
     struct tm *timeptr;

     temp = time(NULL);
     timeptr = localtime(&temp);

     rc = strftime(s,sizeof(s),"Today is %A, %b %d.\nTime:  %r", timeptr);
     printf("%d characters written.\n%s\n",rc,s);

     return 0;
}

/*************************************************
     The output should be similar to:
     46 characters written
     Today is Wednesday, Oct 24.
     Time:  01:01:15 PM
************************************************************/