آشنایی با شئ Date
یکی دیگر از اشیاء پر کاربرد جاوا اسکریپت، شئ Date است. از این شئ و متدهای آن برای کار با تاریخ و زمان استفاده میشود. برای استفاده از متدهای این شئ، قبل از هر چیز باید یک متغیر از نوع Date ایجاد کرد. دستور زیر متغیری به نام today را از نوع Date ایجاد میکند.
let today = new Date();
در صورتی که هیچ آرگومانی به تابع سازندهی Date ارسال نشود، شیئی که از این تابع بازگردانده میشود حاوی تاریخ و زمان فعلی خواهد بود. برای مشاهدهی تاریخ ذخیره شده در متغیر today به صورت یک رشته، میتوان از متد toString استفاده کرد.
today.toString();
← "Mon Oct 29 2018 22:57:49 GMT+0330 (Iran Standard Time)"
همچنین میتوان تاریخ و زمان دلخواه را به تابع Date ارسال کرد. در این صورت تاریخ ارسال شده در شئ جدید ذخیره میشود. تاریخ و زمان را به اشکال مختلف میتوان به تابع Date ارسال کرد. قطعه کد زیر چند نمونه از انجام این کار را نشان میدهد.
let christmas = new Date('2018 12 25');
christmas.toString();
← "Tue Dec 25 2018 00:00:00 GMT+0330 (Iran Standard Time)"
christmas = new Date('25 December 2018');
christmas.toString();
← "Tue Dec 25 2018 00:00:00 GMT+0330 (Iran Standard Time)"
christmas = new Date('25 Dec 2018');
christmas.toString();
← "Tue Dec 25 2018 00:00:00 GMT+0330 (Iran Standard Time)"
let myDate = new Date('Oct 21 2018 11:00:00');
myDate.toString();
← "Sun Oct 21 2018 11:00:00 GMT+0330 (Iran Standard Time)"
مشاهده میکنید که به روشهای مختلف میتوان تاریخ و زمان مورد نظر را به صورت یک رشته به تابع Date ارسال کرد. اما معمولاً از این روش برای ایجاد اشیاء از نوع Date استفاده نمیشود و روش راحتتر این است که هر یک از اجزاء تاریخ و زمان را به صورت یک مقدار عددی و در یک آرگومان جداگانه ارسال کنیم. در این صورت ترتیب ارسال آرگومانها به این صورت خواهد بود.
Date(year , monthIndex , day , hours , minutes , seconds , milliseconds);
از بین ۷ پارامتر فوق، ارسال دو مورد اول اجباری است. سایر موارد دارای مقدار پیشفرض هستند که در صورت ارسال نشدن آرگومان متناظر، مقدار پیشفرض آنها در نظر گرفته خواهد شد. معنی هر یک از این پارامترها، محدودهی قابل قبول و مقدار پیشفرض آنها به شرح زیر است.
- year : شمارهی سال به صورت یک عدد چهار رقمی. در صورت ارسال عددی بین ۰ تا ۹۹، عدد ارسال شده با ۱۹۰۰ جمع خواهد شد.
- monthIndex : شمارهی ماه که باید عددی بین ۰ تا ۱۱ باشد. عدد ۰ برای ماه اول سال میلادی (ژانویه) و عدد ۱۱ برای ماه آخر سال میلادی (دسامبر) میباشد.
- day : شمارهی روز که باید عددی بین ۱ تا ۳۱ باشد. مقدار پیشفرض این پارامتر ۱ است.
- hours : عددی بین ۰ تا ۲۳ که نشان دهندهی ساعت است. مقدار پیشفرض این پارامتر ۰ است.
- minutes : عددی بین ۰ تا ۵۹ که نشان دهندهی دقیقه است. مقدار پیشفرض این پارامتر ۰ است.
- seconds : عددی بین ۰ تا ۵۹ که نشان دهندهی ثانیه است. مقدار پیشفرض این پارامتر ۰ است.
- milliseconds : عددی بین ۰ تا ۹۹۹ که نشان دهندهی میلیثانیه است. مقدار پیشفرض این پارامتر ۰ است.
همچنین در صورتی که عدد ارسال شده به هر یک از پارامترهای فوق بیش از محدودهی مجاز باشد، به تعداد لازم به پارامتر قبلی اضافه شده و از پارامتر مذکور کاسته خواهد شد. مثلاً اگر مقدار پارامتر ثانیه را ۳۱۰ ارسال کنیم. ۳۰۰ ثانیه از آن (معادل ۵ دقیقه) به پارامتر قبلی (یعنی دقیقه) اضافه شده و مقدار باقی مانده (یعنی ۱۰) به عنوان ثانیه در نظر گرفته میشود. نمونههایی از ایجاد اشیاء Date با این روش در قطعه کد زیر نشان داده شده است.
let myDate = new Date(2018 , 11);
myDate.toString();
← "Sat Dec 01 2018 00:00:00 GMT+0330 (Iran Standard Time)"
myDate = new Date(2018 , 0 , 2);
myDate.toString();
← "Tue Jan 02 2018 00:00:00 GMT+0330 (Iran Standard Time)"
myDate = new Date(2018 , 1 , 36); // عدد 36 بزرگتر از محدودهی مجاز است. ماه فوریه 28 روز دارد
myDate.toString();
← "Thu Mar 08 2018 00:00:00 GMT+0330 (Iran Standard Time)"
myDate = new Date(2018 , 2 , 2 , 2 , 2 , 2 , 222);
myDate.toString();
← "Fri Mar 02 2018 02:02:02 GMT+0330 (Iran Standard Time)"
روش دیگر برای ایجاد اشیاء از نوع Date، استفاده از برچسب زمان یا Timestamp است. Timestamp روشی برای نشان دادن زمان با استفاده از یک عدد صحیح بزرگ است. این عدد صحیح تعداد میلیثانیههای سپری شده از تاریخ اول ژانویه ۱۹۷۰ را نشان میدهد. با توجه به این که حدود ۵۰ سال از این تاریخ میگذرد، تعداد میلیثانیههای سپری شده از این تاریخ عددی بسیار بزرگ خواهد بود. به همین دلیل درک مقدار واقعی تاریخ و زمان از روی این عدد برای انسان کار بسیار دشواری است. با این حال این روش در برخی موارد به دو دلیل کاربرد دارد. اولاً برای ذخیرهسازی تاریخ و زمان در این روش فقط به یک عدد احتیاج داریم. ثانیاً انجام محاسبات بر روی یک عدد کار بسیار سادهتری است. قطعه کد زیر نمونههایی از ایجاد اشیاء Date را با این روش نشان میدهد.
let myDate = new Date(0);
myDate.toString();
← "Thu Jan 01 1970 03:30:00 GMT+0330 (Iran Standard Time)"
myDate = new Date(100000000);
myDate.toString();
← "Fri Jan 02 1970 07:16:40 GMT+0330 (Iran Standard Time)"
myDate = new Date(100000000000);
myDate.toString();
← "Sat Mar 03 1973 13:16:40 GMT+0330 (Iran Standard Time)"
myDate = new Date(1540848025346);
myDate.toString();
← "Tue Oct 30 2018 00:50:25 GMT+0330 (Iran Standard Time)"
توجه کنید که مفهوم Timestamp مختص جاوا اسکریپت نیست و در بسیاری از زبانهای برنامهنویسی دیگر نیز مورد استفاده قرار میگیرد. البته در برخی زبانها مانند PHP، عدد Timestamp تعداد ثانیههای سپری شده از اول ژانویه ۱۹۷۰ را نشان میدهد. در نتیجه عددی که در این زبانها به عنوان Timestamp برای تاریخ و زمانی خاص به کار برده میشود، سه رقم کمتر از Timestamp معادل همان زمان در جاوا اسکریپت خواهد داشت.
متدهای شئ Date
پس از تعریف یک متغیر از نوع Date و مقداردهی اولیهی آن، با استفاده از متدهای شئ Date میتوان هر یک از اجزاء تشکیل دهندهی تاریخ و زمان را خواند، و یا آنها را تغییر داد. تعداد زیادی متد برای این منظور در شئ Date وجود دارد که بیشتر این متدها دارای دو نسخه هستند. یک نسخه بر اساس زمان محلی (Local Time) و نسخهی دیگر بر اساس زمان جهانی یا UTC در نظر گرفته شده است. مثلاً متدهای getDate و getUTCDate هر دو شمارهی روز (بین ۱ تا ۳۱) را بازمیگردانند. که اولی بر اساس زمان محلی و دومی بر اساس زمان جهانی کار میکند. در ادامه فقط متدهای مرتبط با زمان محلی معرفی میشوند. اما برای تمام این متدها، نسخهی مشابهی برای زمان UTC وجود دارد که از آنها صرف نظر میکنیم. البته متدهای getTime و getTimezoneOffset استثنا هستند و نسخهی UTC ندارند.
متدهای دسترسی به اجزاء تاریخ و زمان
- getDay : شمارهی روز هفته را که عددی بین ۰ تا ۶ است بازمیگرداند. عدد ۰ برای یکشنبه و عدد ۶ برای شنبه.
- getDate : شمارهی روز ماه را که عددی بین ۱ تا ۳۱ است بازمیگرداند.
- getMonth : شمارهی ماه را که عددی بین ۰ تا ۱۱ است بازمیگرداند. عدد ۰ برای ژانویه و عدد ۱۱ برای دسامبر.
- getFullYear : شمارهی سال را به صورت یک عدد ۴ رقمی بازمیگرداند.
- getHours : عدد ساعت را که بین ۰ تا ۲۳ است بازمیگرداند.
- getMinutes : عدد دقیقه را که بین ۰ تا ۵۹ است بازمیگرداند.
- getSeconds : عدد ثانیه را که بین ۰ تا ۵۹ است بازمیگرداند.
- getMilliseconds : عدد میلیثانیه را که بین ۰ تا ۹۹۹ است بازمیگرداند.
- getTime : تاریخ و زمان ذخیره شده را به صورت Timestamp بازمیگرداند. (برای تاریخهای قبل از ۱۹۷۰، عدد منفی بازگردانده میشود)
- getTimezoneOffset : میزان اختلاف زمان محلی و زمان جهانی را بر حسب دقیقه بازمیگرداند. (در نیمکرهی شرقی منفی، و در نیمکرهی غربی مثبت است)
نمونههایی از کاربرد این متدها در قطعه کد زیر نشان داده شده است.
let myDate = new Date(1540848025346);
myDate.toString();
← "Tue Oct 30 2018 00:50:25 GMT+0330 (Iran Standard Time)"
myDate.getDay();
← 2
myDate.getDate();
← 30
myDate.getMonth();
← 9
myDate.getFullYear();
← 2018
myDate.getSeconds();
← 25
myDate.getMilliseconds();
← 346
myDate.getTime();
← 1540848025346
myDate.getTimezoneOffset();
← -210
متدهای تنظیم تاریخ و زمان
به غیر از متدهای getTimezoneOffset و getDay، برای سایر متدهای دسترسی به اجزاء تاریخ و زمان، متدهای مشابهی برای تنظیم تاریخ و زمان وجود دارد. با این تفاوت که به جای پیشوند get باید از پیشوند set در نام این متدها استفاده شود و مقدار جدید نیز به عنوان آرگومان به این متدها ارسال شود. نمونههایی از کاربرد این متدها را در قطعه کد زیر مشاهده میکنید.
let myDate = new Date(1540848025346);
myDate.toString();
← "Tue Oct 30 2018 00:50:25 GMT+0330 (Iran Standard Time)"
myDate.setDate(17);
myDate.toString();
← "Wed Oct 17 2018 00:50:25 GMT+0330 (Iran Standard Time)"
myDate.setHours(14);
myDate.toString();
← "Wed Oct 17 2018 14:50:25 GMT+0330 (Iran Standard Time)"
myDate.setTime(1440000000000);
myDate.toString();
← "Wed Aug 19 2015 20:30:00 GMT+0430 (Iran Daylight Time)"
متدهای استاتیک شئ Date
در بخش قبل دیدیم که برای استفاده از متدهای شئ Math، نیازی به تعریف متغیری از نوع Math نیست. چنین متدهایی را در اصطلاح متدهای استاتیک (Static) مینامند. شئ Date نیز دارای ۳ متد استاتیک است که برای استفاده از آنها نیازی به ایجاد یک شئ از نوع Date نیست و با استفاده از نام این شئ میتوان از این متدها استفاده کرد. این متدها عبارتند از :
- now : زمان فعلی را به صورت Timestamp بازمیگرداند.
- parse : یک تاریخ را به صورت رشته دریافت کرده و معادل آن را به صورت Timestamp بازمیگرداند.
- UTC : یک تاریخ را به صورت ۲ تا ۷ آرگومان عددی دریافت کرده و معادل آن را به صورت Timestamp بازمیگرداند.
قطعه کد زیر نمونههایی از استفاده از این متدهای استاتیک را نشان میدهد.
Date.now();
← 1540897108678
Date.parse('21 October 2014');
← 1413837000000
Date.parse('Aug 19 2015 20:30:00');
← 1440000000000
Date.UTC(2018 , 11 , 11);
← 1544486400000
Date.UTC(2018 , 11 , 11 , 10 , 20 , 30 , 222);
← 1544523630222
متدهای تبدیل قالب تاریخ
شئ Date دارای چندین متد برای تبدیل و نمایش تاریخ با قالبهای مختلف، از جمله تاریخ شمسی است. در قطعه کد زیر فقط چند نمونه از کاربرد این متدها نشان داده شده است. در صورت تمایل میتوانید لیست کامل این متدها را به همراه چندین مثال اینجا مشاهده کنید.
let myDate = new Date(2018, 6, 28, 14, 39, 7);
myDate.toDateString();
← "Sat Jul 28 2018"
myDate.toLocaleDateString('fa-IR');
← "۱۳۹۷/۵/۶"
let options = {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric'
};
myDate.toLocaleDateString('fa-IR' , options);
← "۱۳۹۷ مرداد ۶, شنبه"
myDate.toLocaleDateString('ar-SA', options);
← "السبت، ١٥ ذو القعدة ١٤٣٩ هـ"
مشاهده میکنید که به راحتی میتوان تاریخ و زمان ذخیره شده در اشیاء از نوع Date را به قالبهای مختلف تبدیل کرد. با این حال تاریخ در این اشیاء، همیشه بر اساس تاریخ میلادی ذخیره میشود و متدهای دسترسی و تنظیم اجزاء تاریخ و زمان بر اساس تاریخ میلادی کار میکنند. اما این امکان نیز وجود دارد تا شئ جدیدی تعریف کنیم که امکان کار با تاریخ شمسی را به صورت مستقیم فراهم کند. البته برای ایجاد چنین شیئی باید در پشت صحنه از شئ Date نیز استفاده کنیم.