溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++獲取本地時(shí)間常見方法匯總

發(fā)布時(shí)間:2020-10-07 12:53:04 來源:腳本之家 閱讀:120 作者:Dabelv 欄目:開發(fā)技術(shù)

1.跨平臺方法

1.1方法一:手動暴力法

#include <iostream>
using namespace std;
#include <time.h>

time_t t = time(NULL);
struct tm* stime=localtime(&t);
char tmp[32]={NULL};
sprintf(tmp, "%04d-%02d-%02d %02d:%02d:%02d",1900+stime->tm_year,1+stime->tm_mon,stime->tm_mday, stime->tm_hour,stime->tm_min,stime->tm_sec);
cout<<tmp<<endl;

輸出結(jié)果:

2015-04-02 23:12:56

1.2方法二:投機(jī)取巧法

#include <iostream>
using namespace std;
#include <time.h>

time_t t = time(0); 
char tmp[32]={NULL};
strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S",localtime(&t)); 
cout<<tmp<<endl;

輸出結(jié)果:

2015-04-02 23:12:56

1.3方法三:簡獲日歷時(shí)間法

#include <iostream>
using namespace std;
#include <time.h>
#include <string>

time_t tm;
time(&tm);
char tmp[128]={NULL};
strcpy(tmp,ctime(&tm));
//或者
//struct tm* stime=localtime(&tm);
//strcpy(tmp,asctime(stime));
cout<<tmp<<endl;

輸出結(jié)果:

Fri Aug 14 23:19:42 2015

2.Windows平臺獲取時(shí)間

#include <iostream>
using namespace std;
#include <time.h>
#include <windows.h>

SYSTEMTIME sys; 
GetLocalTime(&sys);
char tmp[64]={NULL};
sprintf(tmp,"%4d-%02d-%02d %02d:%02d:%02d ms:%03d",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds); 
cout<<tmp<<endl;

輸出結(jié)果:

2015-08-14 23:41:56 ms:354

3.Unix平臺獲取時(shí)間

#include <sys/time.h> 
#include <unistd.h>

struct timeval now_time;
gettimeofday(&now_time, NULL);
time_t tt = now_time.tv_sec;
tm *temp = localtime(&tt);
char time_str[32]={NULL};
sprintf(time_str,"%04d-%02d-%02d%02d:%02d:%02d",temp->tm_year+ 1900,temp->tm_mon+1,temp->tm_mday,temp->tm_hour,temp->tm_min, temp->tm_sec);
cout<<tmp<<endl;

輸出時(shí)間:

2015-08-14 23:41:56

4.需知知識點(diǎn)

(1)UTC (Coordinated Universal Time):協(xié)調(diào)世界時(shí),又稱世界標(biāo)準(zhǔn)時(shí)間。曾由格林威治平均時(shí)間(Greenwich Mean Time,GMT)提供,現(xiàn)在由原子鐘提供。比如,中國內(nèi)地的時(shí)間與UTC的時(shí)差為+8,也就是UTC+8。美國是UTC-5。

(2)Calendar Time:日歷時(shí)間,是用“從一個(gè)標(biāo)準(zhǔn)時(shí)間點(diǎn)到此時(shí)的時(shí)間經(jīng)過的秒數(shù)”來表示的時(shí)間,由time()函數(shù)獲取。這個(gè)標(biāo)準(zhǔn)時(shí)間點(diǎn)對不同的編譯器來說會有所不同,但對一個(gè)編譯系統(tǒng)來說,這個(gè)標(biāo)準(zhǔn)時(shí)間點(diǎn)是不變的,該編譯系統(tǒng)中的時(shí)間對應(yīng)的日歷時(shí)間都通過該標(biāo)準(zhǔn)時(shí)間點(diǎn)來衡量,所以可以說日歷時(shí)間是“相對時(shí)間”,但是無論你在哪一個(gè)時(shí)區(qū),在同一時(shí)刻對同一個(gè)標(biāo)準(zhǔn)時(shí)間點(diǎn)來說,日歷時(shí)間都是一樣的。

(3)Epoch指的是一個(gè)特定的時(shí)間點(diǎn):1970-01-01 00:00:00 UTC,即Unix 時(shí)間戳。

(4)clock tick:時(shí)鐘計(jì)時(shí)單元(而不把它叫做時(shí)鐘滴答次數(shù)),一個(gè)時(shí)鐘計(jì)時(shí)單元的時(shí)間長短是由CPU控制的。一個(gè)clock tick不是CPU的一個(gè)時(shí)鐘周期,而是C/C++的一個(gè)基本計(jì)時(shí)單位。
在VC++的time.h文件中,我們可以找到相關(guān)的定義:

#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif

#define CLOCKS_PER_SEC ((clock_t)1000)

clock_t clock( void );

這個(gè)函數(shù)返回從“開啟這個(gè)程序進(jìn)程”到“程序中調(diào)用clock()函數(shù)”時(shí)之間的CPU時(shí)鐘計(jì)
時(shí)單元(clock tick)數(shù),在MSDN中稱之為掛鐘時(shí)間(wal-clock)。

//獲取逝去時(shí)間
clock_t start, finish;
start=clock();
…
finish=clock();

//逝去多少秒
long duration=(finish- start)/ CLOCKS_PER_SEC;

(5) time.h還提供了兩種不同的函數(shù)將日歷時(shí)間(一個(gè)用time_t表示的整數(shù))轉(zhuǎn)換為我們平時(shí)看到的年月日時(shí)分秒分開顯示的時(shí)間格式tm:

struct tm * gmtime(const time_t *timer);
struct tm * localtime(const time_t * timer);

其中g(shù)mtime()函數(shù)是將日歷時(shí)間轉(zhuǎn)化為世界標(biāo)準(zhǔn)時(shí)間(即格林尼治時(shí)間),并返回一個(gè)tm結(jié)構(gòu)體來保存這個(gè)時(shí)間,而localtime()函數(shù)是將日歷時(shí)間轉(zhuǎn)化為本地時(shí)間。比如現(xiàn)在用gmtime()函數(shù)獲得的世界標(biāo)準(zhǔn)時(shí)間是2005年7月30日7點(diǎn)18分20秒,那么我用localtime()函數(shù)在中國地區(qū)獲得的本地時(shí)間會比世界標(biāo)準(zhǔn)時(shí)間晚8個(gè)小時(shí)。

(6)分解時(shí)間就是以年、月、日、時(shí)、分、秒等分量保存的時(shí)間結(jié)構(gòu),在C/C++中是tm結(jié)構(gòu)。我們可以使用mktime()函數(shù)將用tm結(jié)構(gòu)表示的時(shí)間轉(zhuǎn)化為日歷時(shí)間。其函數(shù)原型如下:

time_t mktime(struct tm * timeptr);

該函數(shù)與gmtime和localtime函數(shù)具有相反的作用。

以上就是C++獲取本地時(shí)間常見方法匯總的詳細(xì)內(nèi)容,更多關(guān)于C++ 獲取本地時(shí)間的資料請關(guān)注億速云其它相關(guān)文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI