C++ 標(biāo)準(zhǔn)庫沒有提供一個合適的日期類型。C++ 從 C 中繼承了針對日期和時間的結(jié)構(gòu)和功能,為了訪問與日期和時間相關(guān)的功能和結(jié)構(gòu),需要在 C++ 程序中包括 <ctime> 頭文件。
這里有四個與時間相關(guān)的類型:clock_t、time_t、size_t 和 tm。clock_t,size_t 和 time_t 類型能夠以某種類型的整數(shù)表示系統(tǒng)時間和日期。
結(jié)構(gòu)類型 tm 以 C 結(jié)構(gòu)體的形式支持日期和時間,有以下元素:
struct tm {
int tm_sec; // seconds of minutes from 0 to 61
int tm_min; // minutes of hour from 0 to 59
int tm_hour; // hours of day from 0 to 24
int tm_mday; // day of month from 1 to 31
int tm_mon; // month of year from 0 to 11
int tm_year; // year since 1900
int tm_wday; // days since sunday
int tm_yday; // days since January 1st
int tm_isdst; // hours of daylight savings time
}
以下是我們在 C 或 C++ 中處理日期和時間時使用的一些重要的函數(shù)。所有這些函數(shù)都是標(biāo)準(zhǔn) C 和 C++ 庫的一部分,你可以使用下面給出的 C++ 標(biāo)準(zhǔn)庫引用查看它們的使用細節(jié)。
序號 | 功能與目的 |
---|---|
1 | time_t time(time_t *time);這將返回當(dāng)前系統(tǒng)的日歷時間,以自 1970 年 1 月 1 日開始系統(tǒng)運行秒數(shù)的形式。如果系統(tǒng)沒有時間,返回 1。 |
2 | char *ctime(const time_t *time);這返回一個指向字符串的指針,字符串形式為 day month year hours:minutes:seconds year\n\0。 |
3 | struct tm *localtime(const time_t *time);這將返回一個指向 tm 結(jié)構(gòu)體的指針,tm 結(jié)構(gòu)體代表當(dāng)?shù)貢r間。 |
4 | clock_t clock(void);這將返回一個與被調(diào)用程序運行時間的總和接近的值。如果時間無效,返回 1。 |
5 | char * asctime ( const struct tm * time );這將返回一個指向字符串的指針,該字符串包含的信息以如下結(jié)構(gòu)體存儲,結(jié)構(gòu)體形式如下:day month year hours:minutes:seconds year\n\0 |
6 | struct tm *gmtime(const time_t *time);它返回一個指向時間的指針,該時間是 tm 結(jié)構(gòu)的。時間用協(xié)調(diào)世界時(UTC)表示,在本質(zhì)上是格林威治標(biāo)準(zhǔn)時間(GMT)。 |
7 | time_t mktime(struct tm *time);返回日歷時間,時間以參數(shù)中指出的結(jié)構(gòu)形式表示。 |
8 | double difftime ( time_t time2, time_t time1 );這個函數(shù)計算秒 time1 和 time2 之間的差異。 |
9 | size_t strftime();這個函數(shù)可以用于以一種特定格式來格式化日期和時間。 |
考慮你想要取得當(dāng)前系統(tǒng)的日期和時間,作為當(dāng)?shù)貢r間或作為一個協(xié)調(diào)世界時(UTC)。下面是一個實現(xiàn)相同目的的示例:
#include <iostream>
#include <ctime>
using namespace std;
int main( )
{
// current date/time based on current system
time_t now = time(0);
// convert now to string form
char* dt = ctime(&now);
cout << "The local date and time is: " << dt << endl;
// convert now to tm struct for UTC
tm *gmtm = gmtime(&now);
dt = asctime(gmtm);
cout << "The UTC date and time is:"<< dt << endl;
}
編譯和執(zhí)行上面的代碼,執(zhí)行結(jié)果如下:
The local date and time is: Sat Jan 8 20:07:41 2011
The UTC date and time is:Sun Jan 9 03:07:41 2011
無論是在 C 還是在 C++ 中,tm 結(jié)構(gòu)體在處理日期和時間時都是非常重要的。如前所述,該結(jié)構(gòu)以一種 C 語言結(jié)構(gòu)體的形式支持日期和時間。大部分與時間相關(guān)的函數(shù)使用 tm 結(jié)構(gòu)。下面是一個例子,它使用了各種各樣日期和時間的相關(guān)函數(shù)和 tm 結(jié)構(gòu):
在本章中使用結(jié)構(gòu)體,基于一個假設(shè):你已經(jīng)對 C 語言的結(jié)構(gòu)體有了基本的了解,并且知道如何使用箭頭操作符:-> 訪問結(jié)構(gòu)體成員。
#include <iostream>
#include <ctime>
using namespace std;
int main( )
{
// current date/time based on current system
time_t now = time(0);
cout << "Number of sec since January 1,1970:" << now << endl;
tm *ltm = localtime(&now);
// print various components of tm structure.
cout << "Year: "<< 1900 + ltm->tm_year << endl;
cout << "Month: "<< 1 + ltm->tm_mon<< endl;
cout << "Day: "<< ltm->tm_mday << endl;
cout << "Time: "<< 1 + ltm->tm_hour << ":";
cout << 1 + ltm->tm_min << ":";
cout << 1 + ltm->tm_sec << endl;
}
編譯和執(zhí)行上面的代碼,執(zhí)行結(jié)果如下:
Number of sec since January 1, 1970:1294548238
Year: 2011
Month: 1
Day: 8
Time: 22: 44:59