فهرست سرفصل‌های ++C
خانه (HOME) مقدمه (Intro) شروع کار (Get Started) نحوه نگارش (Syntax) دستورات (Statements) چاپ متن (Print Text) چاپ اعداد (Print Numbers) خط های جدید (New Lines) کامنت ها (Comments) اعلان متغیرها (Declare Variables) متغیرهای متعدد (Multiple Variables) شناسه ها (Identifiers) ثابت ها (Constants) نمونه های دنیای واقعی (Real-Life Examples) ورودی کاربر (User Input) انواع داده پایه (Basic Data Types) اعداد (Numbers) بولی ها (Booleans) کاراکترها (Characters) رشته ها (Strings) کلیدواژه auto (The auto Keyword) نمونه عملی (Real-Life Example) عملگرها (Operators) حسابی (Arithmetic) انتساب (Assignment) مقایسه (Comparison) منطقی (Logical) اولویت (Precedence) مقدمه رشته ها (Strings Intro) به هم چسباندن (Concatenation) اعداد و رشته ها (Numbers and Strings) طول رشته (String Length) دسترسی به رشته ها (Access Strings) کاراکترهای ویژه (Special Characters) ورودی کاربرِ رشته ها (User Input Strings) حذف فضای نام (Omitting Namespace) رشته های سبک C (C-Style Strings) ریاضی (Math) مقادیر بولی (Boolean Values) عبارات بولی (Boolean Expressions) نمونه عملی (Real-Life Example) شرط ها If...Else (If...Else) else (else) else if (else if) اگر کوتاه (Short hand if..else) تودر تو (Nested if) عملگرهای منطقی (Logical Operators) سوییچ (Switch) حلقه While (While Loop) حلقه Do/While (Do/While Loop) نمونه های عملی (Real-Life Examples) حلقه For (For Loop) حلقه های تو در تو (Nested Loops) حلقه foreach (The foreach Loop) نمونه های عملی (Real-Life Examples) شکستن/ادامه (Break/Continue) آرایه ها (Arrays) آرایه ها و حلقه ها (Arrays and Loops) حذف اندازه آرایه (Omit Array Size) گرفتن اندازه آرایه (Get Array Size) نمونه عملی (Real-Life Example) آرایه های چندبعدی (Multidimensional Arrays) ساختارها (Structures) گزاره شمار/Enums (Enums) ارجاع ها (References) ساخت ارجاع (Create References) آدرس حافظه (Memory Address) اشاره گرها (Pointers) ایجاد اشاره گر (Create Pointers) ارجاع زدایی (Dereferencing) تغییر اشاره گرها (Modify Pointers) مدیریت حافظه (Memory Management) new و delete (new and delete) توابع (Functions) پارامترهای تابع (Function Parameters) پارامتر/آرگومان ها (Parameters/Arguments) پارامتر پیش فرض (Default Parameter) پارامترهای متعدد (Multiple Parameters) مقادیر بازگشتی (Return Values) ارسال با ارجاع (Pass By Reference) ارسال آرایه ها (Pass Arrays) ارسال ساختارها (Pass Structures) نمونه عملی (Real-Life Example) بارگذاری هم نام (Function Overloading) بازگشت/بازگشتی (Recursion) لامبدا (Lambda) برنامه نویسی شی گرا OOP (OOP) کلاس ها/اشیاء (Classes/Objects) متدهای کلاس (Class Methods) سازنده ها (Constructors) سازنده سربار (Constructor Overloading) مشخصه های دسترسی (Access Specifiers) کپسوله سازی (Encapsulation) توابع دوست (Friend Functions) ارث بری (Inheritance) ارث بری چندسطحی (Multilevel Inheritance) ارث بری چندگانه (Multiple Inheritance) مشخصه های دسترسی در ارث بری (Access Specifiers) چندریختی (Polymorphism) توابع مجازی (Virtual Functions) قالب ها (Templates) فایل ها (Files) تاریخ (Date) اشکال زدایی (Debugging) استثناها (Exceptions) اعتبارسنجی ورودی (Input Validation) ساختارهای داده و STL (Data Structures & STL) وکتورها (Vectors) لیست (List) پشته ها (Stacks) صف ها (Queues) دک (Deque) مجموعه ها (Sets) نقشه ها (Maps) الگوریتم ها (Algorithms) فضای نام ها (Namespaces) پروژه ها (Projects) جمع دو عدد (Add Two Numbers) اعداد تصادفی (Random Numbers)
++C

++C — تاریخ (Date)

آخرین بروزرسانی: 1404/08/04

تاریخ (Date)

در C++ با کتابخانه «سی تایم (ctime)» می توانیم با «تاریخ و زمان (Date/Time)» کار کنیم. یعنی زمان فعلی را بگیریم، تبدیل کنیم، و قالب بندی کنیم. مانند زنگ مدرسه است؛ ساعت زنگ را می گیری و طبق آن برنامه ریزی می کنی.

شروع کار با ctime

برای استفاده، هدر <ctime> را اضافه کن. سپس می توانی توابع زمان را صدا بزنی.

#include <ctime>

مشاهده در ادیتور

نمایش تاریخ و زمان فعلی

تابع time() «مُهرِزمان (Timestamp)» می دهد. سپس با ctime() همان را خوانا چاپ می کنیم.

time_t timestamp;
time(&timestamp);
cout << ctime(&timestamp);

مشاهده در ادیتور

نکته: می توانی بنویسی 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(&timestamp);

مشاهده در ادیتور

نکته: عضوهای سال، ماه، روز و زمان باید مقدار داشته باشند. همچنین 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(&timestamp);
cout << datetime.tm_hour;

مشاهده در ادیتور

نمایش با asctime() و تصحیح تاریخ

برای چاپِ یک ساختار زمان، از asctime() استفاده کن. اما asctime() تاریخ نامعتبر را اصلاح نمی کند. در عوض، mktime() اصلاح می کند.

time_t timestamp = time(NULL);
struct tm datetime = *localtime(&timestamp);
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(&timestamp);
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";

مشاهده در ادیتور

گام های تمرینی

  1. یک timestamp فعلی بگیر و چاپ کن.
  2. با mktime() یک تاریخ مشخص بساز.
  3. روز هفته آن تاریخ را نمایش بده.
  4. با strftime() دو قالب مختلف چاپ کن.
  5. اختلاف تا اول سال بعد را حساب کن.

مطالعه بیشتر

برای ذخیره گزارش ها، صفحه فایل ها را ببین. همچنین برای الگوهای قابل استفاده مجدد، به قالب ها سر بزن. برای این صفحه تاریخ نیز نشانی ثابت داریم.

جمع بندی سریع

  • time() مهرِزمان فعلی را می دهد.
  • mktime() ساختارِ زمان را تبدیل می کند.
  • localtime() و gmtime() ساختار می دهند.
  • strftime() نمایش تاریخ را قالب بندی می کند.
  • difftime() اختلاف زمانی را برمی گرداند.