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() 函數會將位元組放入 s 所指向的陣列中,如 format所指向的字串所控制。 格式字串由零或多個轉換規格及一般字元組成。 轉換規格由% 字元和終止轉換字元組成,可決定轉換的行為。 所有一般字元 (包括終止空值位元組及多位元組字元) 都會依原樣複製到陣列中。 如果在重疊的物件之間進行複製,則未定義行為。 陣列中放置的位元組數不超過 maxsize 個。 適當的字元由 timeptr所指向結構中包含的值以及現行語言環境中儲存的值來決定。

每一個標準轉換規格都會取代為適當的字元,如下表所述:

指定元 (specifier) 意義
%a 縮寫平日名稱。
%A 完整平日名稱。
%b 縮寫的月份名稱。
%B 完整月份名稱。
%c 語言環境格式的日期/時間。
%C 世紀數字 [00-99] ,年份除以 100 並截斷為整數。
%d 日期 [01-31]。
%D 日期格式,與 %m/%d/%y 相同。
%e 與 %d相同,但單一數字前面有空格 [1-31]。
%g ISO 週日期 [00,99] 的 2 位數年份部分。
%F ISO 日期格式,與 %Y-%m-%d相同。
%G ISO 週日期的 4 位數年份部分。 可以是負數。
%h 與 %b相同。
%h 24 小時制的小時 [00-23]。
%I 12 小時制的小時 [01-12]。
%j 一年中的第 1 天 [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]。 星期一是一週的第一天。 如果包含 1st 的週在新的一年中有四天以上,則視為第 1 週。 否則,它是前一年的最後一週,而下一年是新一年的第 1 週。
%w 平日 [0, 6] ,星期日是 0。
%W 一年中的週數 [00-53]。 星期一是一週的第一天。
%x 語言環境格式的日期。
%X 以語言環境格式表示的時間。
%y 2 位數年份 [00,99]。
%Y 4 位數字的年份。 可以是負數。
%z UTC 誤差。 輸出是格式為 +HHMM-HHMM的字串,其中 + 表示 GMT 以東,-表示 GMT 以西, HH 表示 GMT 開始的時數, MM 表示 GMT 開始的分鐘數。
%Z 時區名稱。
%% % 字元。

已修改轉換指定元

部分轉換指定元可以由 E 或 O 修飾元字元修改,以指出應該使用替代格式或規格,而不是未修改轉換指定元通常使用的格式或規格。 如果已修改的轉換指定元使用現行語言環境中無法使用的欄位,則行為會如同使用未修改的轉換規格一樣。 例如,如果 era 字串是空字串 "" ,這表示字串無法使用,則 %EY 會像 %Y 一樣。

指定元 (specifier) 意義
%Ec 現行紀元的日期/時間。
%EC 年代名稱。
%Ex 現行時代的日期。
%EX 現在是時代的時候了
%Ey 紀元年。 這是與基準年的偏移。
%EY 現行時代的年份。
%Od 使用替代數字的日期。
%Oe 與 %Od 相同。
%OH 使用替代數字的 24 小時格式中的小時。
%OI 使用替代數字的 12 小時格式中的小時。
%Om 使用替代數字的月份。
%OM 使用替代數字的分鐘數。
作業系統 (%OS) 使用替代數字的秒數。
%藕 使用替代數字的平日。 星期一是 1 ,星期日是 7。
%OU 使用替代數字的年份週數。 星期日是每週的第一天。
%OV 使用替代數字的 ISO 年週數。 如需 ISO 週數的說明,請參閱 %V。
%Ow 使用替代數字的平日。 星期日是 0。
%OW 使用替代數字的年份週數。 星期一是一週的第一天。
%Oy 2 位數年份,使用替代數字。
%OZ 如果現行語言環境中存在時區名稱,則與 %Z 相同; 否則會傳回現行工作的縮寫時區名稱。
附註: 在編譯指令上指定 LOCALETYPE (*CLD) 時,無法使用 %C、%D、 %e、%h、%n、%r、%R、%t、%T、 %u、%V 及已修改的轉換指定元。

回覆值

如果產生的位元組總數 (包括終止空值位元組) 不超過 maxsize ,則 strftime() 會傳回放入 s所指向陣列中的位元組數 (不包括終止空值位元組)。 否則,會傳回 0 ,且陣列內容不確定。

如果發生轉換錯誤, errno 可能設為 ECONVERT

範例

#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
************************************************************/

相關資訊