標籤:c++目前時間 time 日曆時間
一、首先,我們要分清楚幾個概念:
1、Coordinated Universal Time(UTC):國際標準時間,又稱為世界標準時間,也就是格林威治標準時間(Greenwich Mean Time,GMT)。比如,中國內地的時間與UTC的時差為+8,也就是UTC+8。美國是UTC-5。以年、月、日、時、分、秒錶示
2、Calendar Time:日曆時間,是用“從一個標準時間點(如:1970年1月1日0時0分0秒)到此時的時間經過的秒數”來表示的時間。可以說日曆時間是“相對時間”,但是無論你在哪一個時區,在同一時刻對同一個標準時間點來說,日曆時間都是一樣的。 以秒錶示
3、local time:當地時間:中國就是北京時間
二、與日期和時間相關的資料結構
在標準C/C++中,我們可通過tm結構來獲得日期和時間,tm結構在time.h中的定義如下:
#ifndef _TM_DEFINEDstruct **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()為負。*/#define _TM_DEFINED#endif
ANSI C標準稱使用tm結構的這種時間表示為分解時間(broken-down time)。
而日曆時間(Calendar Time)是通過time_t資料類型來表示的,用time_t表示的時間(日曆時間)是從一個時間點(例如:1970年1月1日0時0分0秒)到此時的秒數。在time.h中,我們也可以看到time_t是一個長整型數:
#ifndef _TIME_T_DEFINEDtypedef long time_t; /* 時間值 */#define _TIME_T_DEFINED; /* 避免重複定義 time_t */#endif
與時間日期相關的函數:
asctime(); 將時間和日期以字串格式表示,只是把tm結構對象中的各個域**填到時間字串的相應位置**,可顯示世界時間和本地時間 ctime(); 把日期和時間轉換為字串 自動把世界時間轉化為本地時間再顯示 gmtime(); 把日期和時間轉換為(GMT)時間 localtime(); 取得當地目前時間和日期 mktime(); 將時間結構資料轉換成經過的秒數 strftime(); 將時間格式化 time(); 取得日曆時間:從1970年1月1日0時0分0秒到此時的秒數" 啟動並執行結果與當時的時間有關 strftime();將時間格式化為我們想要的格式 clock(); 確定處理器時間 可用來計算某段程式執行的時間 difftime(); 計算兩個時刻之間的時間差
程式如下:
#include <iostream>#include <time.h> /* time_t, struct tm, time, localtime, asctime */using namespace std;int main(){ /*————————————獲得日曆時間——————————————————————*/ time_t rawtime; time(&rawtime); cout << time(&rawtime) << endl; /*————————轉換日曆時間,獲得世界時間和當地時間————————*/ struct tm * timeinfo; timeinfo = localtime(&rawtime); cout << "localtime 當地時間:" << timeinfo->tm_hour << endl; timeinfo = gmtime(&rawtime); cout << "gmtime 世界時間:" << timeinfo->tm_hour << endl << endl; /*——————————將時間以固定格式顯示 如:Wed Jan 02 02:03:55 1980/n/0——————————————————————*/ cout << "asctime 顯示時間(當地、世界)" << asctime(timeinfo) << endl;// cout << "ctime 自動把世界時間轉化為本地時間再顯示 "<<ctime(&rawtime) << endl; /*————————————自訂時間格式——————————————————————*/ cout << timeinfo->tm_hour << ":" << timeinfo->tm_min << ":" << timeinfo->tm_sec << endl; char pblgtime[20]; strftime(pblgtime, 20, "%Y-%m-%d %X", localtime(&rawtime)); cout << "strftime " << pblgtime << endl; return 0;
運行結果:
其中函數strftime()的操作有些類似於sprintf():識別以百分比符號(%)開始的格式命令集合,格式化輸出結果放在一個字串中。格式化命令說明串strDest中各種日期和時間資訊的確切表示方法。格式串中的其他字元原樣放進串中。格式命令列在下面,它們是區分大小寫。
%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 每周的第幾天,星期一為第一天 (值從0到6,星期一為0)%U 第年的第幾周,把星期日做為第一天(值從0到53)%V 每年的第幾周,使用基於周的年%w 十進位表示的星期幾(值從0到6,星期天為0)%W 每年的第幾周,把星期一做為第一天(值從0到53)%x 標準的日期串%X 標準的時間串%y 不帶世紀的十進位年份(值從0到99)%Y 帶世紀部分的十進位年份%z,%Z 時區名稱,如果不能得到時區名稱則返回Null 字元。%% 百分比符號
另外可參考部落格:http://blog.csdn.net/limi0066/article/details/1761564
<C++>擷取並顯示目前時間