1. 程式人生 > >C語言 時間函數的學習

C語言 時間函數的學習

簡寫 print cpp 目前 時區 stdlib.h 基於 名稱 eva

一直都是以簡單的time_t t,time(&t),ctime(&t)來表示時間,後來要以時間為日誌文件的名字時,就有點蒙逼了。學習一下。

tm結構:
struct tm
{
 
     int tm_sec; /* 秒 – 取值區間為[0,59] */
 
     int tm_min; /* 分 - 取值區間為[0,59] */
 
     int tm_hour; /* 時 - 取值區間為[0,23] */
 
     int tm_mday; /* 一個月中的日期 - 取值區間為[1,31] */
 
     int tm_mon; /* 月份(從一月開始,0代表一月) - 取值區間為[0,11] */
int tm_year; /* 年份,其值等於實際年份減去1900 */ int tm_wday; /* 星期 – 取值區間為[0,6],其中0代表星期天,1代表星期一,以此類推 */ int tm_yday; /* 從每年的1月1日開始的天數 – 取值區間為[0,365],其中0代表1月1日,1代表1月2日,以此類推 */ int tm_isdst; /* 夏令時標識符,實行夏令時的時候,tm_isdst為正。不實行夏令時的進候,tm_isdst為0;不了解情況時,tm_isdst()為負。*/

獲取當地時間的函數 :struct tm localtime(const time_t

timep);
獲得格林威治時間的函數:struct tm gmtime(const time_t timep);
兩個函數的用法是一樣的,以localtime為例子說明

#include <time.h>
int main()
{
    char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    time_t timep;
    struct tm *p;
    time(&timep);
    p = localtime(&timep); //取得當地時間
    printf ("
%d/%d/%d ", (1900+p->tm_year), (l+p->tm_mon), p->tm_mday); printf("%s%d:%d:%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec); }

執行結果

2016/06/3 Fri 21:25:34

也有轉換成標準格式的函數size_t strftime(char strDest, size_t maxsize, const char format, const struct tm *timeptr)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
 
int main(int argc, char **argv)
 {
     time_t t;
     struct tm *lt;
     char nowtime[24];
 
     t = time(NULL);
     lt = localtime(&t);
 
     memset(nowtime, 0, sizeof(nowtime));
     strftime(nowtime, sizeof(nowtime), "%Y-%m-%d %H:%M:%S", lt);
     printf("nowtime = %s\n", nowtime);
     return 0;
 }

輸出 nowtime = 2016-6-3 21:23:07

可選擇的格式有
%a 星期幾的簡寫
 
%A 星期幾的全稱
 
%b 月份的簡寫
 
%B 月份的全稱
 
%c 標準的日期的時間串
 
%C 年份的前兩位數字
 
%d 十進制表示的每月的第幾天
 
%D 月/天/年
 
%e 在兩字符域中,十進制表示的每月的第幾天
 
%F 年-月-日
 
%g 年份的後兩位數字,使用基於周的年
 
%G 年份,使用基於周的年
 
%h 簡寫的月份名
 
%H 24小時制的小時
 
%I 12小時制的小時
 
%j 十進制表示的每年的第幾天
 
%m 十進制表示的月份
 
%M 十時制表示的分鐘數
 
%n 新行符
 
%p 本地的AM或PM的等價顯示
 
%r 12小時的時間
 
%R 顯示小時和分鐘:hh:mm
 
%S 十進制的秒數
 
%t 水平制表符
 
%T 顯示時分秒:hh:mm:ss
 
%u 每周的第幾天,星期一為第一天 (值從1到7,星期一為1)
 
%U 第年的第幾周,把星期日作為第一天(值從0到53)
 
%V 每年的第幾周,使用基於周的年
 
%w 十進制表示的星期幾(值從0到6,星期天為0)
 
%W 每年的第幾周,把星期一做為第一天(值從0到53)
 
%x 標準的日期串
 
%X 標準的時間串
 
%y 不帶世紀的十進制年份(值從0到99)
 
%Y 帶世紀部分的十制年份
 
%z,%Z 時區名稱,如果不能得到時區名稱則返回空字符。
 
%% 百分號

獲取微秒級時間的方法int gettimeofday(struct timeval tv, struct timezone tz),目前的時間用tv所指的結構返回,時區信息則存在tz所指的結構裏。

struct timeval
{
     long tv_sec;/秒/
     long tv_usec;/微秒/
};
struct timezone
{
     int tz_minutestwest;/和格林威治時間差幾分鐘/
     int tz_dsttime;
}

一般運用時,置tz為空,只取tv的值。

#include <sys/time.h>
#include <stdio.h>
int main(void)
{
     int i;
     struct timeval tv;
    
     for(i = 0; i < 4; i++)
     {
          gettimeofday(&tv, NULL);
          printf("%d\t%d\n", tv.tv_usec, tv.tv_sec);
          sleep(1);
     }
 
     return 0;
}

C語言 時間函數的學習