مقدمه

یکی از چالش‌های همیشگی در برنامه‌نویسی، کار با زمان و تاریخ است. جاوااسکریپت نوع داده‌ای مخصوص برای کار با تاریخ و زمان دارد: Date. با استفاده از این نوع می‌توانید زمان فعلی، تاریخ‌های گذشته و آینده، مقایسه و محاسبه اختلاف زمانی، تبدیل به رشته و بسیاری عملیات دیگر را انجام دهید. تسلط بر کار با Date به شما کمک می‌کند اپلیکیشن‌های تعاملی و حرفه‌ای‌تری تولید کنید.

در این درس تمام مفاهیم کلیدی و رایج کار با تاریخ و زمان در جاوااسکریپت را با مثال‌های عملی و نکات حرفه‌ای یاد می‌گیرید.

ساخت شیء Date و زمان فعلی

برای ایجاد یک شیء Date جدید کافیست سازنده Date را با عملگر new صدا بزنید. اگر این سازنده را بدون آرگومان فراخوانی کنیم، تاریخ و زمان فعلی سیستم را برمی‌گرداند. اما می‌توانیم تاریخ خاصی را هم به صورت پارامتر (سال، ماه، روز و ...) به این سازنده بدهیم.

ماه‌ها در جاوااسکریپت از ۰ (ژانویه) شروع می‌شوند، پس برای ساخت ماه صحیح باید عدد ماه را منهای یک کنید. می‌توانید تاریخ را به صورت رشته هم وارد کنید.

Copy Icon JAVASCRIPT
let now = new Date();
let birthday = new Date(1999, 4, 22);
let fromString = new Date("2024-06-01T12:00:00");
console.log(now);
console.log(birthday);
console.log(fromString);

در این مثال، سه شیء Date مختلف ساخته‌ایم: یکی برای زمان فعلی، یکی با پارامتر سال/ماه/روز (توجه کنید ماه ۴ یعنی May چون از صفر شروع می‌شود)، و یکی با رشته تاریخ و زمان. خروجی هر کدام در کنسول قابل مشاهده است.

دریافت و تنظیم اجزای تاریخ و زمان

هر شیء Date مجموعه‌ای از متدها برای دریافت (get) و تنظیم (set) اجزای تاریخ و زمان دارد. این اجزا شامل سال، ماه، روز، ساعت، دقیقه، ثانیه و میلی‌ثانیه هستند. همه این متدها با پیشوند get یا set شروع می‌شوند.

Copy Icon JAVASCRIPT
let d = new Date();
console.log(d.getFullYear());   // سال فعلی
console.log(d.getMonth());      // ماه (۰ تا ۱۱)
console.log(d.getDate());       // روز ماه
console.log(d.getHours());      // ساعت
console.log(d.getMinutes());    // دقیقه
console.log(d.getSeconds());    // ثانیه

این متدها با get شروع شده و بنابراین، برای دریافت اجزای زمانی کاربرد دارند اما هر یک از این متدها یک متد معادلی دارد که با set شروع می‌شود و جزء زمانی مورد نظر را تنظیم می‌کند. مثال زیر را ببینید.

Copy Icon JAVASCRIPT
let d = new Date();
d.setFullYear(2025);
d.setMonth(0);
d.setDate(15);
console.log(d);

در این مثال، سال، ماه و روز شیء Date را با متدهای set تغییر دادیم. حالا مقدار جدید تاریخ در شیء d ذخیره شده است.

تبدیل تاریخ به رشته و فرمت‌دهی

برای نمایش تاریخ در قالب‌های قابل خواندن یا ذخیره‌سازی، باید شیء Date را به رشته تبدیل کنید. متدهای مختلفی برای این کار وجود دارد: toString (نمایش کامل)، toLocaleDateString (نمایش محلی)، toISOString (فرمت استاندارد بین‌المللی) و ...

می‌توانید با گزینه‌های محلی، تاریخ را به فرمت و زبان دلخواه نمایش دهید. مثلاً نمایش تاریخ شمسی یا میلادی با منطقه زمانی خاص.

Copy Icon JAVASCRIPT
console.log(d.toString());         // Mon May 27 2024 13:37:00 GMT+...
console.log(d.toLocaleDateString()); // بر اساس زبان سیستم
console.log(d.toISOString());      // 2024-05-27T10:07:00.000Z

در اینجا چند نمونه از فرمت‌دهی تاریخ را می‌بینید. متد toLocaleDateString می‌تواند با پارامترهای مختلف، تاریخ را به زبان و فرمت دلخواه نمایش دهد. مثلاً:

Copy Icon JAVASCRIPT
let d = new Date();
console.log(d.toLocaleDateString("fa-IR")); // نمایش تاریخ به شمسی
console.log(d.toLocaleDateString("en-US", { year: "numeric", month: "long", day: "numeric" })); // June 1, 2024
console.log(d.toLocaleTimeString("en-GB", { hour: "2-digit", minute: "2-digit" })); // 13:45
                    

در این مثال، تاریخ جاری را به فرمت شمسی (fa-IR)، فرمت انگلیسی با نام ماه (en-US)، و ساعت به سبک بریتانیایی (en-GB) نمایش داده‌ایم.

عملیات ریاضی روی تاریخ‌ها

در جاوااسکریپت می‌توان روی مقادیر تاریخ و زمان عملیات ریاضی انجام داد. به عنوان مثال، می‌توانیم اختلاف دو تاریخ را به دست آوریم، تاریخ جدیدی محاسبه کنیم یا تاریخ‌ها را با هم مقایسه کنیم. یک مقدار Date در واقع، تعداد میلی‌ثانیه‌های سپری‌شده از نیمه‌شب یکم ژانویه 1970 را نگهداری می‌کند و این امر امکان انجام محاسبات ریاضی روی این مقادیر را فراهم می‌کند. مثال زیر را ببینید.

Copy Icon JAVASCRIPT
let start = new Date("2024-01-01");
let end = new Date("2024-05-28");
let diff = end - start;
console.log(diff / (1000 * 60 * 60 * 24)); // اختلاف به روز

در این مثال، اختلاف دو تاریخ را محاسبه کردیم. متغیر diff تعداد میلی‌ثانیه‌های بین دو تاریخ را نگه می‌دارد. با تقسیم این مقدار بر تعداد میلی‌ثانیه‌های یک روز (1000 * 60 * 60 * 24)، اختلاف را به روز به دست آوردیم.
همچنین می‌توانید با جمع یا تفریق میلی‌ثانیه به یک شیء Date، تاریخ جدیدی بسازید. مثلاً برای افزودن ۷ روز به تاریخ فعلی:

Copy Icon JAVASCRIPT
let d = new Date();
d.setDate(d.getDate() + 7);
console.log(d); // تاریخ ۷ روز بعد

برای مقایسه تاریخ‌ها نیز می‌توانید از عملگرهای مقایسه‌ای استفاده کنید، زیرا اشیاء Date به صورت عددی (تعداد میلی‌ثانیه) مقایسه می‌شوند.

نوع Date برای کاربردهای عادی کافی است اما برای پروژه‌های مالی و زمان‌بندی‌های حساس، به علت محدودیت‌ها و ناسازگاری با زمان‌های محلی یا تقویم‌های خاص بهتر است از کتابخانه‌هایی مثل moment.js یا date-fns استفاده کنید.

همیشه هنگام کار با زمان و تاریخ در پروژه‌های بین‌المللی، به منطقه زمانی کاربر و تفاوت ساعت سرور و کاربر توجه ویژه داشته باشید.