本文目錄一覽:
C語言如何獲取本地時間,然後取時、分、秒的值?
C語言有2個獲取時間的函數,分別是time()和localtime(),time()函數返回unix時間戳-即從1970年1月1日0:00開始所經過得秒數,而localtime()函數則是將這個秒數轉化為當地的具體時間(年月日時分秒)
這裡時間轉化要用到一個“struct 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日 */
int tm_isdst; /* 夏令時標識符,夏令時tm_isdst為正;不實行夏令時tm_isdst為0 */
};
示例代碼:
#includestdio.h
#includetime.h
int getTime()
{
time_t t; //保存unix時間戳的變量 ,長整型
struct tm* lt; //保存當地具體時間的變量
int p;
time(t); // 等價於 t =time(NULL);獲取時間戳
lt = localtime(t); //轉化為當地時間
p = lt-tm_sec; //將秒數賦值給p
return p;
}
應該就是這樣啦~
c語言中時間處理
1. ctime函數
函數: ctime
功 能: 把日期和時間轉換為字符串
用 法: char *ctime(const time_t *time);
程序例:
#includecstdio
#includectime
intmain(void)
{
time_tt;
t=time(t);
printf(“Today’sdateandtime:%s\n”,ctime(t));
return0;
}
註:若在linux下使用本函數,需要include time.h頭文件
2.CTime類
CTime類的對象表示的時間是基於格林威治標準時間(GMT)的。CTimeSpan類的對象表示的是時間間隔。
CTime類一般不會被繼承使用。其對象的大小是8個字節。
CTime表示的日期上限是2038年1月18日,下限是1970年1月1日 12:00:00 AM GMT。
CTime類的成員函數
CTime();
構造一個未經初始化的CTime對象。此構造函數使我們可以定義一個CTime對象的數組,在使用數組前需要以有效的時間值為其初始化。
CTime(__time64_t time);
以一個__time64_t(注意:最前面的下劃線有兩條)類型的數據來構造一個CTime對象。參數time是一個__time64_t類型的值,表示自GMT時間1970年1月1日零點以來的秒數,這裡要注意的是,參數time代表的時間會轉換為本地時間保存到構造的CTime對象中。例如,我們傳遞參數0構造一個CTime對象,然後調用CTime對象的GetHour成員函數將返回8,因為參數0代表的GMT時間轉換為北京時間後為1970年1月1日 8:00:00。
CTime(
int nYear,
int nMonth,
int nDay,
int nHour,
int nMin,
int nSec,
int nDST = -1
);
以本地時間的年、月、日、小時、分鐘、秒等幾個時間分量構造CTime對象。參數nYear、nMonth、nDay、nHour、nMin、nSec分別表示年、月、日、小時、分鐘、秒,取值範圍如下:
時間分量 取值範圍
nYear 1970-3000
nMonth 1-12
nDay 1-31
nHour 0-23
nMin 0-59
nSec 0-59
參數nDST指定是否實行夏令時,為0時表示實行標準時間,為正數時表示實行夏令時,為負數時由系統自動計算實行的是標準時間還是夏令時。
CTime(const SYSTEMTIME st,int nDST = – 1) ;
以一個SYSTEMTIME結構體變量來構造CTime對象。SYSTEMTIME結構體也是我們對日期時間的常用表示方式。參數st為以本地時間表示的SYSTEMTIME對象,參數nDST同上。
static CTime WINAPI GetCurrentTime( );
獲取系統當前日期和時間。返回表示當前日期和時間的CTime對象。
int GetYear( ) const;
獲取CTime對象表示時間的年份。範圍從1970年1月1日到2038年(包括2038年)1月18日。
int GetMonth( ) const;
獲取CTime對象表示時間的月份。範圍為1到12。
int GetDay( ) const;
獲取CTime對象表示時間的日期。範圍為1到31。
int GetHour( ) const;
獲取CTime對象表示時間的小時。範圍為0到23。
int GetMinute( ) const;
獲取CTime對象表示時間的分鐘。範圍為0到59。
int GetSecond( ) const;
獲取CTime對象表示時間的秒。範圍為0到59。
int GetDayOfWeek( ) const;
此函數的返回值表示CTime對象代表的是星期幾,1表示是周日,2表示是周一,以此類推。
CString Format(LPCTSTR pszFormat) const;
將CTime對象中的時間信息格式化為字符串。參數pszFormat是格式化字符串,與printf中的格式化字符串類似,格式化字符串中帶有%前綴的格式碼將會被相應的CTime時間分量代替,而其他字符會原封不動的拷貝到返回字符串中。格式碼及含義如下:
%a:周的英文縮寫形式。
%A:周的英文全名形式。
%b: 月的英文縮寫形式。
%B:月的英文全名形式。
%c: 完整的日期和時間。
%d:十進制形式的日期(01-31)。
%H:24小時制的小時(00-23)。
%I: 12小時制的小時(00-11)。
%j: 十進制表示的一年中的第幾天(001-366)。
%m: 月的十進制表示(01-12)。
%M:十進制表示的分鐘(00-59)。
%p: 12小時制的上下午標示(AM/PM)。
%S: 十進制表示的秒(00-59)。
%U: 一年中的第幾個星期(00-51),星期日是一周的第一天。
%W: 一年中的第幾個星期(00-51),星期一是一周的第一天。
%w: 十進制表示的星期幾(0-6)。
%Y: 十進制表示的年。
CTime operator +(CTimeSpan timeSpan) const;
將CTime對象和CTimeSpan對象相加,返回一個CTime對象。實際意義就是在一個時間的基礎上推後一個時間間隔,得到一個新的時間。
CTime operator -(CTimeSpan timeSpan) const;
將CTime對象和一個CTimeSpan相減,返回一個CTime對象。實際意義就是在一個時間的基礎上提前一個時間間隔,得到一個新的時間。
CTimeSpan operator -(CTime time) const;
將該CTime對象和另一個CTime對象相減,返回一個CTimeSpan對象。實際意義就是計算兩個時間點的間隔,得到一個CTimeSpan對象。
CTime operator +=(CTimeSpan span);
為該CTime對象增加一個span表示的時間間隔。
CTime operator -=(CTimeSpan span);
為該CTime對象減去一個span表示的時間間隔。
CTime operator =(__time64_t time);
為該CTime對象賦予一個新的時間值。
簡單說下剩下的幾個重載i運算符:
operator == : 比較兩個絕對時間是否相等。
operator != : 比較兩個絕對時間是否不相等。
operator : 比較兩個絕對時間,是否前一個大於後一個。
operator : 比較兩個絕對時間,是否前一個小於後一個。
operator = : 比較兩個絕對時間,是否前一個大於等於後一個。
operator = : 比較兩個絕對時間,是否前一個小於等於後一個。[1]
=====================================================================
C++中,CTime 與 CString轉換
CTime m_StartTime1 = CTime::GetCurrentTime();
CString csStartTime = m_StartTime1.Format( “%Y%m%d%H%M%S” );
一.將CString轉為CTime的幾種方法
CString timestr = “2000年04月05日”;
int a,b,c ;
sscanf(timestr.GetBuffer(timestr.GetLength()),”%d年%d月%d日”,a,b,c);
CTime time(a,b,c,0,0,0);
——–or – ———————
CString s(“2001-8-29 19:06:23”);
int nYear, nMonth, nDate, nHour, nMin, nSec;
sscanf(s, “%d-%d-%d %d:%d:%d”, nYear, nMonth, nDate, nHour, nMin, nSec);
CTime t(nYear, nMonth, nDate, nHour, nMin, nSec);
—- or ————————
CString timestr = “2000年04月05日”;
int year,month,day;
BYTE tt[5];
//get year
memset(tt, 0, sizeof(tt));
tt[0] = timestr[0];
tt[1] = timestr[1];
tt[2] = timestr[2];
tt[3] = timestr[3];
year= atoi((char *)tt);
//get month
memset(tt, 0, sizeof(tt));
tt[0] = timestr[6];
tt[1] = timestr[7];
month = atoi((char *)tt);
//get day
memset(tt, 0, sizeof(tt));
tt[0] = timestr[10];
tt[1] = timestr[11];
day = atoi((char *)tt);
CTime time(year,month,day,0,0,0);
從上面來看,很明顯使用sscanf()函數的優勢.
二.將CTIme轉換為CString的方法:
CTime tmSCan = CTime::GetCurrentTime();
CString szTime = tmScan.Format(“‘%Y-%m-%d %H:%M:%S'”);
這樣得到的日期時間字符串就是以”2006-11-27 23:30:59″的格式.這是不是很方便呢?
//取得CTime中的日期
CString cstrDate = tmScan.Format(“%Y-%m-%d”);
//取得CTime中的時間
CString cstrTime = tmScan.Format(“%H:%M-%S”);
sprintf還有個不錯的表妹:strftime,專門用于格式化時間字符串的,用法跟她表哥很像,也是一大堆格式控制符,只是畢竟小姑娘家心細,她還要調用者指定緩衝區的最大長度,可能是為了在出現問題時可以推卸責任吧。這裡舉個例子:
更多更好的sprintf()函數說明參考:《spirntf,你知道多少?》
time_t t = time(0);
//產生”YYYY-MM-DD hh:mm:ss”格式的字符串。
char s[32];
strftime(s, sizeof(s), “%Y-%m-%d %H:%M:%S”, localtime(t));
sprintf在MFC中也能找到他的知音:CString::Format,strftime在MFC中自然也有她的同道:CTime::Format,這一對由於從面向對象哪裡得到了贊助,用以寫出的代碼更覺優雅
C語言中的時間
以前實際上用過,很想對C語言中的時間函數了解多一點,趁着這個寒假,查了些資料,大概把我現在能用到的關於時間的操作在此記錄下來。通過幾個函數來熟悉C語言中對時間的操作。(註:以下程序均在VS2010上編譯通過。)①time()函數。可以通過time()函數來獲得日曆時間。其原型為:time_ttime(time_t*timer);一般參數為空,返回值類型time_t是一個長整型數,函數將返回現在的日曆時間,即從一個時間點(所有不同版本的VisualC++都是從1970年1月1日0時0分0秒)到現在的經過的秒數。例子程序:#includestdio.h#includetime.hvoidmain(){time_tlt;lt=time(NULL);printf(“1970年1月1日0時0分0秒到現在經歷了%ld秒\n”,lt);}運行結果(結果與程序運行的時間有關,貼出我此時運行出的結果):1970年1月1日0時0分0秒到現在經歷了1326975564秒請按任意鍵繼續…②clock()函數。C語言中的計時函數。函數原型為:clock_tclock(void);clock()函數返回從“開啟這個程序進程”到“程序中調用clock()函數”時之間的CPU時鐘計時單元數。返回值類型clock_t也是一個長整型數。在time.h頭文件中定義了一個符號常量CLOCKS_PER_SEC,表示一秒鐘會有多少個計時單元。所以通過簡單的數學知識,可以知道在程序中用clock()/CLOCKS_PER_SEC來表示程序從開始到調用clock()函數時用了多少秒。例子程序:#includestdio.h#includetime.hvoidmain(){clock_tlt;for(inti=0;i1000000000;i++);lt=clock();printf(“循環執行1000000000個空操作需要%f秒\n”,(double)lt/CLOCKS_PER_SEC);}運行結果(在不同的機器上運行的結果可能不一樣,下面是在我自己的筆記本上運行的結果):循環執行1000000000個空操作需要3.484000秒請按任意鍵繼續…③使用C庫函數來顯示日期和時間。首先要介紹一下C語言中的一個日期的結構體類型,tm類型。其在time.h中的定義如下:#ifndef_TM_DEFINEDstructtm{inttm_sec;inttm_min;inttm_hour;inttm_mday;inttm_mon;inttm_year;inttm_wday;inttm_yday;inttm_isdst;};#define_TM_DEFINED#endif然後可以介紹有關的函數了。time.h提供了兩種不同的函數將日曆時間(一個長整型數)轉換成我們平時看到的把年月日時分秒分開的時間格式:structtm*gmtime(consttime_t*timer);structtm*localtime(consttime_t*timer);其中gmtime()函數是將日曆時間轉換為世界標準時間(即格林尼治時間),並返回一個tm結構體來保存這個時間,而localtime()函數是將日曆時間轉換為本地時間(在中國地區獲得的本地時間會比世界標準時間晚8個小時)。例子程序:#includestdio.h#includetime.hvoidmain(){structtm*local;time_tt;t=time(NULL);local=localtime(t);printf(“現在北京時間是%d點\n”,local-tm_hour);local=gmtime(t);printf(“世界標準時間是%d點\n”,local-tm_hour);}運行結果(運行結果與運行的時間有關,我是在早上9點多鐘運行這個程序的):現在北京時間是9點世界標準時間是1點請按任意鍵繼續…這樣子我們就可以完全才輸出此刻的年月日時分秒了,當然需要逐個來輸出。其實C庫函數還提供了一個很有用的以固定的時間格式來輸出年月日時分秒的函數。這兩個函數原型如下:char*asctime(conststructtm*timeptr);char*ctime(consttime_t*timer);asctime()函數是通過tm結構來生成具有固定格式的保存時間信息的字符串,而ctime()是通過日曆時間來生成時間字符串。這樣下面的例子程序就容易理解了:#includestdio.h#includetime.hvoidmain(){structtm*local;time_tt;t=time(NULL);local=localtime(t);printf(asctime(local));local=gmtime(t);printf(asctime(local));printf(ctime(t));}運行結果(我是在早上9點多運行這個程序的):FriJan2009:55:562012FriJan2001:55:562012FriJan2009:55:562012請按任意鍵繼續…C語言還可以以我們規定的各種形式來規定輸出時間的格式。要用到時可以查閱相關的資料,限於篇幅,就介紹到這裡。④這裡介紹計算持續的時間長度的函數。之前已經介紹了使用clock()函數的例子,它可以精確到毫秒級。其實我們也可以使用difftime()函數,但它只精確到秒。該函數的定義如下:doubledifftime(time_ttime1,time_ttime0);例子程序:#includestdio.h#includetime.h#includestdlib.hvoidmain(){time_tstart,end;start=time(NULL);for(inti=0;i1000000000;i++);end=time(NULL);printf(“這個循-環用了%f秒\n”,difftime(end,start));}運行結果:這個循環用了3.000000秒請按任意鍵繼續…⑤最後介紹mktime()函數。原型如下:time_tmktime(structtm*timer);可以使用函數將用tm結構表示的時間轉換為日曆時間。其返回值就是轉換後的日曆時間。這樣我們就可以先制定一個分解時間,然後對這個時間進行操作。下面的例子用來計算2012年1月20日是星期幾:#includetime.h#includestdio.h#includestdlib.hintmain(void){structtmt;time_tt_of_day;t.tm_year=2012-1900;t.tm_mon=0;t.tm_mday=20;t.tm_hour=0;t.tm_min=12;t.tm_sec=1;t.tm_isdst=1;t_of_day=mktime(t);printf(ctime(t_of_day));return0;}運行結果:FriJan2000:12:012012請按任意鍵繼續…
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/247267.html