linux系統時間程式設計(6) 日曆時間tm轉字串strftime函式

奇妙之二進位制發表於2021-01-01
<time.h>
size_t strftime( char * str, size_t count, const char * format, const struct tm * time );(until C99)
size_t strftime( char *restrict str, size_t count, const char *restrict format, const struct tm *restrict time );(since C99)

count指出了寫到str的最大長度,不包含\0,所以使用者提供的str的長度必須大於等於count+1。

format用於指定輸出的格式,這個格式非常豐富,見下表:

%+下面的字母代表一段字串。

Conversion specifierExplanationUsed fields
%writes literal %. The full conversion specification must be %%.
n (C99)writes newline character
t (C99)writes horizontal tab character
Year
Ywrites year as a decimal number, e.g. 2017**tm_year**
EY (C99)writes year in the alternative representation, e.g.平成23年 (year Heisei 23) instead of 2011年 (year 2011) in ja_JP locale**tm_year**
ywrites last 2 digits of year as a decimal number (range [00,99])**tm_year**
Oy (C99)writes last 2 digits of year using the alternative numeric system, e.g. 十一 instead of 11 in ja_JP locale**tm_year**
Ey (C99)writes year as offset from locale’s alternative calendar period %EC (locale-dependent)**tm_year**
C (C99)writes first 2 digits of year as a decimal number (range [00,99])**tm_year**
EC (C99)writes name of the base year (period) in the locale’s alternative representation, e.g. 平成 (Heisei era) in ja_JP**tm_year**
G (C99)writes ISO 8601 week-based year, i.e. the year that contains the specified week.In IS0 8601 weeks begin with Monday and the first week of the year must satisfy the following requirements:Includes January 4Includes first Thursday of the year**tm_year**, **tm_wday**, **tm_yday**
g (C99)writes last 2 digits of ISO 8601 week-based year, i.e. the year that contains the specified week (range [00,99]).In IS0 8601 weeks begin with Monday and the first week of the year must satisfy the following requirements:Includes January 4Includes first Thursday of the year**tm_year**, **tm_wday**, **tm_yday**
Month
bwrites abbreviated month name, e.g. Oct (locale dependent)**tm_mon**
Ob (C23)writes abbreviated month name in the locale’s alternative representation**tm_mon**
h (C99)synonym of b**tm_mon**
Bwrites full month name, e.g. October (locale dependent)**tm_mon**
OB (C23)writes appropriate full month name in the locale’s alternative representation**tm_mon**
mwrites month as a decimal number (range [01,12])**tm_mon**
Om (C99)writes month using the alternative numeric system, e.g. 十二 instead of 12 in ja_JP locale**tm_mon**
Week
Uwrites week of the year as a decimal number (Sunday is the first day of the week) (range [00,53])**tm_year**, **tm_wday**, **tm_yday**
OU (C99)writes week of the year, as by %U, using the alternative numeric system, e.g. 五十二 instead of 52 in ja_JP locale**tm_year**, **tm_wday**, **tm_yday**
Wwrites week of the year as a decimal number (Monday is the first day of the week) (range [00,53])**tm_year**, **tm_wday**, **tm_yday**
OW (C99)writes week of the year, as by %W, using the alternative numeric system, e.g. 五十二 instead of 52 in ja_JP locale**tm_year**, **tm_wday**, **tm_yday**
V (C99)writes ISO 8601 week of the year (range [01,53]).In IS0 8601 weeks begin with Monday and the first week of the year must satisfy the following requirements:Includes January 4Includes first Thursday of the year**tm_year**, **tm_wday**, **tm_yday**
OV (C99)writes week of the year, as by %V, using the alternative numeric system, e.g. 五十二 instead of 52 in ja_JP locale**tm_year**, **tm_wday**, **tm_yday**
Day of the year/month
jwrites day of the year as a decimal number (range [001,366])**tm_yday**
dwrites day of the month as a decimal number (range [01,31])**tm_mday**
Od (C99)writes zero-based day of the month using the alternative numeric system, e.g 二十七 instead of 27 in ja_JP localeSingle character is preceded by a space.**tm_mday**
e (C99)writes day of the month as a decimal number (range [1,31]).Single digit is preceded by a space.**tm_mday**
Oe (C99)writes one-based day of the month using the alternative numeric system, e.g. 二十七 instead of 27 in ja_JP localeSingle character is preceded by a space.**tm_mday**
Day of the week
awrites abbreviated weekday name, e.g. Fri (locale dependent)**tm_wday**
Awrites full weekday name, e.g. Friday (locale dependent)**tm_wday**
wwrites weekday as a decimal number, where Sunday is 0 (range [0-6])**tm_wday**
Ow (C99)writes weekday, where Sunday is 0, using the alternative numeric system, e.g. 二 instead of 2 in ja_JP locale**tm_wday**
u (C99)writes weekday as a decimal number, where Monday is 1 (ISO 8601 format) (range [1-7])**tm_wday**
Ou (C99)writes weekday, where Monday is 1, using the alternative numeric system, e.g. 二 instead of 2 in ja_JP locale**tm_wday**
Hour, minute, second
Hwrites hour as a decimal number, 24 hour clock (range [00-23])**tm_hour**
OH (C99)writes hour from 24-hour clock using the alternative numeric system, e.g. 十八 instead of 18 in ja_JP locale**tm_hour**
Iwrites hour as a decimal number, 12 hour clock (range [01,12])**tm_hour**
OI (C99)writes hour from 12-hour clock using the alternative numeric system, e.g. 六 instead of 06 in ja_JP locale**tm_hour**
Mwrites minute as a decimal number (range [00,59])**tm_min**
OM (C99)writes minute using the alternative numeric system, e.g. 二十五 instead of 25 in ja_JP locale**tm_min**
Swrites second as a decimal number (range [00,60])**tm_sec**
OS (C99)writes second using the alternative numeric system, e.g. 二十四 instead of 24 in ja_JP locale**tm_sec**
Other
cwrites standard date and time string, e.g. Sun Oct 17 04:41:13 2010 (locale dependent)all
Ec (C99)writes alternative date and time string, e.g. using 平成23年 (year Heisei 23) instead of 2011年 (year 2011) in ja_JP localeall
xwrites localized date representation (locale dependent)all
Ex (C99)writes alternative date representation, e.g. using 平成23年 (year Heisei 23) instead of 2011年 (year 2011) in ja_JP localeall
Xwrites localized time representation, e.g. 18:40:20 or 6:40:20 PM (locale dependent)all
EX (C99)writes alternative time representation (locale dependent)all
D (C99)equivalent to "%m/%d/%y"**tm_mon**, **tm_mday**, **tm_year**
F (C99)equivalent to “%Y-%m-%d” (the ISO 8601 date format)**tm_mon**, **tm_mday**, **tm_year**
r (C99)writes localized 12-hour clock time (locale dependent)**tm_hour**, **tm_min**, **tm_sec**
R (C99)equivalent to "%H:%M"**tm_hour**, **tm_min**
T (C99)equivalent to “%H:%M:%S” (the ISO 8601 time format)**tm_hour**, **tm_min**, **tm_sec**
pwrites localized a.m. or p.m. (locale dependent)**tm_hour**
z (C99)writes offset from UTC in the ISO 8601 format (e.g. -0430), or no characters if the time zone information is not available**tm_isdst**
Zwrites locale-dependent time zone name or abbreviation, or no characters if the time zone information is not available**tm_isdst**

返回值
如果產生的 C 字串小於count個字元(不包括空結束字元),則會返回複製到 str 中的字元總數(不包括空結束字元),否則返回零。

例子

#include <stdio.h>
#include <time.h>
#include <locale.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");
    }
}

Possible output:

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

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

int main ()
{
   time_t rawtime;
   struct tm *info;
   char buffer[80];

   time( &rawtime );

   info = localtime( &rawtime );

   strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", info);
   printf("格式化的日期 & 時間 : |%s|\n", buffer );
  
   return(0);
}

讓我們編譯並執行上面的程式,這將產生以下結果:

格式化的日期 & 時間 : |2018-09-19 08:59:07|

相關文章