C++ 日期和時間
日期和時間
<ctime>
庫允許我們處理日期和時間。
要使用它,您必須匯入 <ctime>
標頭檔案
示例
#include <ctime> // Import the ctime library
顯示當前日期和時間
<ctime>
庫提供了各種函式來測量日期和時間。
time()
函式為我們提供一個表示當前日期和時間的時間戳。我們可以使用 ctime()
函式來顯示時間戳所代表的日期和時間
示例
顯示當前日期
// Get the timestamp for the current date and time
time_t timestamp;
time(×tamp);
// Display the date and time represented by the timestamp
cout << ctime(×tamp);
自己動手試一試 »
使用 time() 函式的兩種方式
time()
函式將時間戳寫入引數給定的記憶體位置,但它也返回時間戳的值。
使用 time()
函式的另一種方法是傳入一個 NULL 指標,並改用返回值。
time_t timestamp = time(NULL);
資料型別
有兩種不同的資料型別用於儲存日期和時間:用於時間戳的 time_t
和用於日期時間結構的 struct tm
。
時間戳將時間點表示為單個數字,這使得計算機更容易進行計算。
日期時間結構是表示日期和時間不同組成部分作為成員的結構體。這使得我們更容易指定日期。日期時間結構具有以下成員:
tm_sec
- 分鐘內的秒數tm_min
- 小時內的分鐘數tm_hour
- 一天中的小時數(從 0 到 23)tm_mday
- 月份中的日期tm_mon
- 月份(從 0 到 11,1 月為 0)tm_year
- 自 1900 年以來的年數tm_wday
- 星期幾(從 0 到 6,星期日為 0)tm_yday
- 一年中的天數(從 0 到 365,1 月 1 日為 0)tm_isdst
- 夏令時生效時為正,不生效時為零,未知時為負
請務必記住日期組成部分的表示方式
- 小時以 24 小時製表示。晚上 11 點將表示為 23。
- 月份從 0 到 11。例如,12 月將表示為 11 而不是 12。
- 年份相對於 1900 年表示。2024 年將表示為 124,因為自 1900 年以來已經過去了 124 年。
建立時間戳
time()
函式只能為當前日期建立時間戳,但我們可以使用 mktime()
函式為任何日期建立時間戳。
mktime()
函式將日期時間結構轉換為時間戳。
示例
使用 mktime()
函式建立時間戳
struct tm datetime;
time_t timestamp;
datetime.tm_year = 2023 - 1900; // Number of years since 1900
datetime.tm_mon = 12 - 1; // Number of months since January
datetime.tm_mday = 17;
datetime.tm_hour = 12;
datetime.tm_min = 30;
datetime.tm_sec = 1;
// Daylight Savings must be specified
// -1 uses the computer's timezone setting
datetime.tm_isdst = -1;
timestamp = mktime(&datetime);
cout << ctime(×tamp);
自己動手試一試 »
注意:mktime()
函式需要這些成員具有值:tm_year
、tm_mon
、tm_mday
、tm_hour
、tm_min
、tm_sec
和 tm_isdst
。
建立日期時間結構
mktime()
函式還會用正確的值填充日期時間結構的 tm_wday
和 tm_yday
成員,從而完成結構並提供有效的日期時間。例如,它可用於查詢給定日期的星期幾
示例
查詢指定日期的星期幾
// Create the datetime structure and use mktime to fill in the missing members
struct tm datetime;
datetime.tm_year = 2023 - 1900; // Number of years since 1900
datetime.tm_mon = 12 - 1; // Number of months since January
datetime.tm_mday = 17;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
mktime(&datetime);
string weekdays[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
cout << "The date is on a " << weekdays[datetime.tm_wday];
自己動手試一試 »
localtime()
和 gmtime()
函式可以將時間戳轉換為日期時間結構。
localtime()
函式返回一個指向表示計算機時區時間的結構的指標。
gmtime()
函式返回一個指向表示 GMT 時區時間的結構的指標。
這些函式返回一個指向日期時間結構的指標。如果我們想確保其值不會意外更改,我們應該透過解引用指標來複制它。要了解解引用,請參閱 C++ 解引用教程。
示例
獲取日期時間結構並輸出當前小時
time_t timestamp = time(×tamp);
struct tm datetime = *localtime(×tamp);
cout << datetime.tm_hour;
自己動手試一試 »
顯示日期
到目前為止,我們一直使用 ctime()
函式來顯示時間戳中包含的日期。要從日期時間結構顯示日期,我們可以使用 asctime()
函式。
示例
顯示日期時間結構表示的日期
time_t timestamp = time(NULL);
struct tm datetime = *localtime(×tamp);
cout << asctime(&datetime);
自己動手試一試 »
注意:asctime()
函式不會糾正無效日期。例如,如果您將月份中的日期設定為 32,它將顯示 32。mktime()
函式可以糾正這些型別的錯誤
示例
在顯示日期之前糾正它
// Create the datetime structure and use mktime to correct mistakes
struct tm datetime;
datetime.tm_year = 2022 - 1900; // Number of years since 1900
datetime.tm_mon = 0; // 0 is January
datetime.tm_mday = 32;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
mktime(&datetime);
cout << asctime(&datetime);
自己動手試一試 »
ctime()
和 asctime()
函式允許我們顯示日期,但它們不允許我們選擇如何顯示它。
要選擇如何顯示日期,我們可以使用 strftime()
函式。
示例
以不同方式表示當前日期
time_t timestamp = time(NULL);
struct tm datetime = *localtime(×tamp);
char output[50];
strftime(output, 50, "%B %e, %Y", &datetime);
cout << output << "\n";
strftime(output, 50, "%I:%M:%S %p", &datetime);
cout << output << "\n";
strftime(output, 50, "%m/%d/%y", &datetime);
cout << output << "\n";
strftime(output, 50, "%a %b %e %H:%M:%S %Y", &datetime);
cout << output << "\n";
自己動手試一試 »
strftime()
函式格式化日期並將其作為 C 風格字串寫入 char
陣列。它有四個引數
- 第一個引數指向將寫入格式化日期的字元陣列。
- 第二個引數指定陣列中可用的空間。
- 第三個引數允許我們使用格式說明符選擇如何格式化日期。
- 最後一個引數是指向包含我們要顯示日期的日期時間結構的指標。
下表列出了一些有用的格式說明符。有關更完整的列表,請檢視 strftime() 參考頁面。
格式說明符 | 描述 | 示例 |
---|---|---|
%a |
星期幾的短表示 | 星期五 |
%b |
月份名稱的短表示 | Dec |
%B |
月份名稱的完整表示 | 十二月 |
%d |
月份中的日期,帶前導零 | 09 |
%e |
月份中的日期,帶前導空格 | 9 |
%H |
小時的 24 小時制 | 14 |
%I |
小時的 12 小時制 | 02 |
%M |
小時內的分鐘數 | 30 |
%p |
AM 或 PM | PM |
%S |
分鐘內的秒數 | 01 |
%y |
2 位年份表示 | 23 |
%Y |
4 位年份表示 | 2023 |
測量時間
有兩種不同的函式可用於測量時間差。
difftime()
函式測量兩個不同時間戳之間經過的秒數。這在測量日期之間的時間差時很有用。
示例
測量兩個時間戳之間的時間差
time_t now;
time_t nextyear;
struct tm datetime;
now = time(NULL);
datetime = *localtime(&now);
datetime.tm_year = datetime.tm_year + 1;
datetime.tm_mon = 0;
datetime.tm_mday = 1;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.is_dst = -1;
nextyear = mktime(&datetime);
int diff = difftime(nextyear, now);
cout << diff << " seconds until next year";
自己動手試一試 »
clock()
函式對於在程式執行時測量短時間間隔很有用。它比 difftime()
函式更精確。
每次呼叫 `clock` 函式都會返回一種特殊型別的時間戳,以時鐘(一個取決於庫實現方式的時間單位)為單位,其資料型別為 `clock_t`。要測量時間差,請在兩個不同時間點儲存一個時間戳,然後將其相減。時間差以時鐘為單位測量,但可以透過將其除以 `CLOCKS_PER_SEC` 常量將其轉換為秒。
示例
測量程式執行所需的時間
clock_t before = clock();
int k = 0;
for(int i = 0; i < 100000; i++) {
k += i;
}
clock_t duration = clock() - before;
cout << "Duration: " << (float)duration / CLOCKS_PER_SEC << " seconds";
自己動手試一試 »
注意:請務必在除法之前將值轉換為 float
或 double
型別,否則可能會導致整數除法,從而截斷小數部分。
完整的 <ctime> 參考
有關 <ctime> 函式的完整參考,請訪問我們的 C++ ctime 參考。