1. 程式人生 > 實用技巧 >C 庫 time

C 庫 time

1:函式time(),返回從(1970-01-01 00:00:00 UTC)起經過的時間,單位秒;

time_t seconds;
time(&seconds);
//或者
time_t tm_seconds = time(NULL);

2:struct tm 是儲存時間和日期的結構,定義如下:

struct tm
{
    int tm_sec;   // seconds after the minute - [0, 60] including leap second
    int tm_min;   // minutes after the hour - [0, 59]
    int tm_hour;  //
hours since midnight - [0, 23] int tm_mday; // day of the month - [1, 31] int tm_mon; // months since January - [0, 11] int tm_year; // years since 1900 int tm_wday; // days since Sunday - [0, 6] int tm_yday; // days since January 1 - [0, 365] int tm_isdst; // daylight savings time flag
};

3:asctime() 返回一個可讀日期的字串

struct tm *tm_struct;
char *date= asctime(tm_struct);

4:函式localtime()struct tm *localtime(const time_t *timer) 將timer秒轉化為本地時間的struct tm的結構體,

time_t seconds;
time(&seconds);
struct tm *tm_ptr;
tm_ptr = localtime(&seconds);
char *now_date = asctime(tm_ptr); //Thu Oct 15 16:49:12 2020
printf("%s", now_date);

5:ctime() 獲取到的時間(秒)轉化為一個可讀日期的字串char *ctime(const time_t *timer)

time_t seconds;
time(&seconds);
char *date_c = ctime(&seconds); //Thu Oct 15 17:22:01 2020
printf("%s", date_c);

6:函式difftime() double difftime(time_t time1, time_t time2) 返回倆個時間(time1-time2)相差的秒

time_t start;
time_t end;
double interval = difftime(end,start);

7:gmtime 與localtime不同的是 gmtime得到是協調世界時(UTC)也被稱為格林尼治標準時間(GMT)

time_t seconds;
time(&seconds);
struct tm tm_info ;
gmtime_s(&tm_info,&seconds);
printf("倫敦:%2d:%02d\n", (tm_info.tm_hour + 1) % 24, tm_info.tm_min);
printf("中國:%2d:%02d\n", (tm_info.tm_hour + 8) % 24, tm_info.tm_min);

8:mktime():time_t mktime(struct tm *time) 把struct tm的結構轉換為一個依據本地時區的 時間值(s)。

struct tm tm_info;
time_t currrent_t = mktime(&tm_info);

9:strftime(buffer, 80, "%Y-%m-%d %H:%M:%S ", tm_ptr); 將struct tm按照一定格式輸出進buffer

strftime(buffer, 80, "%x %X %p %A %B %U  %c", tm_ptr);
printf(" date = %s", buffer);
%a 星期幾的簡寫   %A 星期幾的全稱   %b 月份的簡寫   %B 月份的全稱   %c 標準的日期的時間串   %C 年份的後兩位數字   %d 十進位制表示的每月的第幾天   %D 月/天/年   %e 在兩字元域中,十進位制表示的每月的第幾天   %F 年-月-日   %g 年份的後兩位數字,使用基於周的年   %G 年份,使用基於周的年   %h 簡寫的月份名   %H24小時制的小時   %I 12小時制的小時   %j 十進位制表示的每年的第幾天   %m 十進位制表示的月份   %M 十時製表示的分鐘數   %n 新行符   %p 本地的AM或PM的等價顯示   %r 12小時的時間   %R 顯示小時和分鐘:hh:mm   %S 十進位制的秒數   %t 水平製表符   %T 顯示時分秒:hh:mm:ss   %u 每週的第幾天,星期一為第一天 (值從0到6,星期一為0)   %U 第年的第幾周,把星期日作為第一天(值從0到53)   %V 每年的第幾周,使用基於周的年   %w 十進位制表示的星期幾(值從0到6,星期天為0)   %W 每年的第幾周,把星期一做為第一天(值從0到53)   %x 標準的日期串   %X 標準的時間串   %y 不帶世紀的十進位制年份(值從0到99)   %Y 帶世紀部分的十制年份   %z,%Z 時區名稱,如果不能得到時區名稱則返回空字元。   %% 百分號 10:clock_t clock(void) 獲取處理器時鐘所需的時間,為了獲得秒數除以CLOCKS_PER_SEC
        clock_t start_t, end_t;
    double total_t;
    int i;

    start_t = clock();
    for (i = 0; i < 10000000; i++)
    {
    }
    end_t = clock();
    total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
    printf("CPU 佔用的總時間:%f\n", total_t);

11:結構體timespec

  struct timespec
    {
        time_t tv_sec;  // Seconds - >= 0
        long   tv_nsec; // Nanoseconds - [0, 999999999]
    };

12:timespec_get獲取自1970-01-01 00:00:00 UTC的時間填充timespec結構 ,timespec_get(struct timespec *ts,int base);

    struct tm *tm_ptr;
    struct timespec ts;
    char buffer[256] = { 0 };
    timespec_get(&ts,TIME_UTC);
    tm_ptr=localtime(&ts.tv_sec);
    strftime(buffer, 80, "%Y-%m-%d %H:%M:%S ", tm_ptr);

13:_get_tzname()檢索時區名稱或夏令時標準時區名稱 (DST) 的字串表示形式

    enum TZINDEX {
        STD,
        DST
    };
    
    size_t tznameSize = 0;
    char  *tznameBuffer =NULL;
    _get_tzname(&tznameSize, NULL, 0, DST);
    tznameBuffer = (char*)malloc(tznameSize);
    if (_get_tzname(&tznameSize, tznameBuffer, tznameSize, DST)==0)
    {
        printf("%s ", tznameBuffer);
    }

14:_get_timezone()協調世界時 (UTC) 和當地時間之間的差異(以秒為單位)。

long zone;
_get_timezone(&zone);

15:_get_daylight( int* hours )夏令時偏移量小時

int hours;
_get_daylight(&hours);

16 :_get_dstbias( int* seconds );夏令時偏移量秒