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
************************************************************/
相關資訊
- asctime ()-將時間轉換為字串
- asctime_r ()-將時間轉換為字串 (可重新啟動)
- ctime ()-將時間轉換為字串
- ctime64()-將時間轉換為字串
- ctime64_r()-將時間轉換為字串 (可重新啟動)
- ctime_r ()-將時間轉換為字串 (可重新啟動)
- gmtime ()-轉換時間
- gmtime64()-轉換時間
- gmtime64_r()-轉換時間 (可重新啟動)
- gmtime_r ()-轉換時間 (可重新啟動)
- localtime ()-轉換時間
- localtime64()-轉換時間
- localtime64_r()-轉換時間 (可重新啟動)
- localtime_r ()-轉換時間 (可重新啟動)
- setlocale ()-設定語言環境
- strptime ()-將字串轉換成日期/時間
- time ()-判定現行時間
- time64()-判定現行時間
- <time.h>