تاریخ (Date)
در C++ با کتابخانه «سی تایم (ctime)» می توانیم با «تاریخ و زمان (Date/Time)» کار کنیم. یعنی زمان فعلی را بگیریم، تبدیل کنیم، و قالب بندی کنیم. مانند زنگ مدرسه است؛ ساعت زنگ را می گیری و طبق آن برنامه ریزی می کنی.
شروع کار با ctime
برای استفاده، هدر <ctime> را اضافه کن. سپس می توانی توابع زمان را صدا بزنی.
#include <ctime>
نمایش تاریخ و زمان فعلی
تابع time() «مُهرِزمان (Timestamp)» می دهد. سپس با ctime() همان را خوانا چاپ می کنیم.
time_t timestamp;
time(×tamp);
cout << ctime(×tamp);
نکته: می توانی بنویسی time_t timestamp = time(NULL); تا مستقیماً مقدار را بگیری.
نوع ها: timestamp و ساختار datetime
نوع time_t یک عدد لحظه است. اما struct tm یک «ساختار زمان» با جزءهای جداگانه است؛ مثل ساعت، دقیقه، ماه.
ساختن timestamp دلخواه با mktime()
وقتی تاریخِ مشخص می خواهی، عضوهای tm را پُر کن. سپس با mktime() آن را به timestamp تبدیل کن.
struct tm datetime;
time_t timestamp;
datetime.tm_year = 2023 - 1900;
datetime.tm_mon = 12 - 1;
datetime.tm_mday = 17;
datetime.tm_hour = 12;
datetime.tm_min = 30;
datetime.tm_sec = 1;
datetime.tm_isdst = -1;
timestamp = mktime(&datetime);
cout << ctime(×tamp);
نکته: عضوهای سال، ماه، روز و زمان باید مقدار داشته باشند. همچنین tm_isdst را تنظیم کن.
یافتن روز هفته یک تاریخ
تابع mktime() عضوهای tm_wday و tm_yday را هم تکمیل می کند. بنابراین می توانیم روز هفته را بخوانیم.
struct tm datetime;
datetime.tm_year = 2023 - 1900;
datetime.tm_mon = 12 - 1;
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];
تبدیل timestamp به ساختارِ محلی یا GMT
تابع های localtime() و gmtime() یک اشاره گرِ ساختار می دهند. بهتر است یک کُپی محلی بگیریم تا مقدار ناخواسته تغییر نکند.
time_t timestamp = time(NULL);
struct tm datetime = *localtime(×tamp);
cout << datetime.tm_hour;
نمایش با asctime() و تصحیح تاریخ
برای چاپِ یک ساختار زمان، از asctime() استفاده کن. اما asctime() تاریخ نامعتبر را اصلاح نمی کند. در عوض، mktime() اصلاح می کند.
time_t timestamp = time(NULL);
struct tm datetime = *localtime(×tamp);
cout << asctime(&datetime);
struct tm datetime;
datetime.tm_year = 2022 - 1900;
datetime.tm_mon = 0;
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);
قالب بندی تاریخ با strftime()
با strftime() می توانی شکل نمایش را انتخاب کنی. خروجی در یک آرایه char نوشته می شود.
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";
اندازه گیری اختلاف زمان با difftime()
برای اختلافِ بین دو timestamp از 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.tm_isdst = -1;
nextyear = mktime(&datetime);
int diff = difftime(nextyear, now);
cout << diff << " seconds until next year";
اندازه گیری سریعِ اجرا با clock()
برای بازه های کوتاه، از clock() استفاده کن. سپس بر 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";
گام های تمرینی
- یک timestamp فعلی بگیر و چاپ کن.
- با
mktime()یک تاریخ مشخص بساز. - روز هفته آن تاریخ را نمایش بده.
- با
strftime()دو قالب مختلف چاپ کن. - اختلاف تا اول سال بعد را حساب کن.
مطالعه بیشتر
برای ذخیره گزارش ها، صفحه فایل ها را ببین. همچنین برای الگوهای قابل استفاده مجدد، به قالب ها سر بزن. برای این صفحه تاریخ نیز نشانی ثابت داریم.
جمع بندی سریع
time()مهرِزمان فعلی را می دهد.mktime()ساختارِ زمان را تبدیل می کند.localtime()وgmtime()ساختار می دهند.strftime()نمایش تاریخ را قالب بندی می کند.difftime()اختلاف زمانی را برمی گرداند.