۲۵ ژوئیه ۲۰۲۲

تاریخ و زمان

بیایید یک شیء درون‌ساخت جدید را بشناسیم: Date. این شیء تاریخ و زمان را ذخیره می‌کند و متدهایی را برای مدیریت تاریخ/زمان فراهم می‌کند.

برای مثال، ما می‌توانیم از آن برای ذخیره‌سازی زمان ساختن/تغییردادن، اندازه‌گیری زمان یا فقط برای نمایش دادن زمان کنونی استفاده کنیم.

ایجاد

برای ایجاد یک شیء Date جدید باید new Date() را با یکی از آرگومان‌های زیر صدا بزنیم:

new Date()

بدون آرگومان – یک شیء Date برای تاریخ و زمان کنونی می‌سازد:

let now = new Date();
alert( now ); // تاریخ/زمان کنونی را نمایش می‌دهد
new Date(milliseconds)

یک شیء Date با زمانی برابر با تعداد میلی‌ثانیه‌هایی (milliseconds، 1/1000 ثانیه) که از اول ژانویه سال 1970 میلادی با UTC+0 گذشته است می‌سازد.

// 01.01.1970 UTC+0 صفر یعنی
let Jan01_1970 = new Date(0);
alert( Jan01_1970 );

// 02.01.1970 UTC+0 :حالا 24 ساعت اضافه می‌کنیم و تاریخی که دریافت می‌کنیم
let Jan02_1970 = new Date(24 * 3600 * 1000);
alert( Jan02_1970 );

عدد صحیحی که تعداد میلی‌ثانیه‌های گذشته از شروع 1970 را نمایش می‌دهد را برچسب زمان (timestamp) می‌گویند.

برچسب زمان یک نمایش آسان از تاریخ است. ما همیشه می‌توانیم با استفاده از new Date(timestamp) یک تاریخ را از یک برچسب زمان بسازیم و شیء Date موجود را با استفاده از متد date.getTime() به برچسب زمان تبدیل کنیم (ادامه متن را ببینید).

:تاریخ‌های قبل از 01.01.1970 برچسب زمان منفی دارند، برای مثال

// سی و یک دسامبر 1969
let Dec31_1969 = new Date(-24 * 3600 * 1000);
alert( Dec31_1969 );
new Date(datestring)

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

let date = new Date("2017-01-26");
alert(date);
// باشد GMT زمان تنظیم نشده است پس فرض می‌شود که نیمه شب
// و با توجه به منطقه‌زمانی‌ای که کد در آن اجرا می‌شود تنظیم می‌شود
// :پس نتیجه می‌تواند این باشد
// Thu Jan 26 2017 11:00:00 GMT+1100 (Australian Eastern Daylight Time)
// یا
// Wed Jan 25 2017 16:00:00 GMT-0800 (Pacific Standard Time)
new Date(year, month, date, hours, minutes, seconds, ms)

یک تاریخ با مؤلفه‎های داده شده در منطقه‌زمانی محلی می‌سازد. فقط دو آرگومان اول ضروری هستند.

  • پارامتر year باید 4 رقم باشد: برای سازگاری، 2 رقم هم مورد قبول است و به صورت 19xx فرض می‌شود، برای مثال 98 با 1998 یکسان است اما همیشه استفاده از 4 رقم پیشنهاد می‌شود.
  • شمارش پارامتر month از 0 (ژانویه) تا 11 (دسامبر) است.
  • پارامتر date در واقع روز ماه است، اگر وارد نشود 1 فرض می‌شود.
  • اگر hours/minutes/seconds/ms وارد نشوند،برای آنها 0 در نظر گرفته می‌شود.

برای مثال:

new Date(2011, 0, 1, 0, 0, 0, 0); // اول ژانویه 2011، ساعت 00:00:00
new Date(2011, 0, 1); // یکسان است، ساعت و بقیه پارامترها به طور پیش‌فرض 0 هستند

:بیشترین دقت 1 میلی‌ثانیه (1/1000 ثانیه) است

let date = new Date(2011, 0, 1, 2, 3, 4, 567);
alert( date ); // 1.01.2011, 02:03:04.567

دسترسی به اجزاء تاریخ

متدهایی برای دسترسی به سال، ماه و بقیه اجزاء در شیء Date وجود دارد:

getFullYear()
دریافت سال (4 رقم)
getMonth()
دریافت ماه، از 0 تا 11.
getDate()
دریافت روز ماه، از 1 تا 31، اسم متد واقعا کمی عجیب بنظر می‌رسد.
getHours()، getMinutes()، getSeconds()، getMilliseconds()
جزء متناظر با خود را دریافت می‌کنند یعنی به ترتیب: ساعت، دقیقه، ثانیه و میلی‌ثانیه.
متد getYear() درست نیست بلکه getFullYear() درست است

بسیاری از موتورهای جاوااسکریپت یک متد غیر استاندارد getYear() را پیاده‌سازی می‌کنند. این متد منسوخ شده است. بعضی اوقات یک سال 2 رقمی را برمی‌گرداند. لطفا هیچ‌وقت از آن استفاده نکنید. متد getFullYear() برای سال وجود دارد.

علاوه بر این، ما می‌توانیم روز هفته را هم دریافت کنیم:

getDay()
دریافت روز هفته، از 0 (Sunday، یکشنبه) تا 6 (Saturday، شنبه). اولین روز همیشه Sunday (یکشنبه) است و در بعضی از کشورها اینگونه نیست اما نمی‌توان آن را تغییر داد.

تمام متدهای بالا اجزاء را با توجه به منطقه زمانی محلی برمی‌گردانند.

همچنین نقطه مقابل آنها در UTC هم وجود دارد که روز، ماه، سال و بقیه را برای منطقه زمانی UTC+0 برمی‌گرداند: getUTCFullYear()، getUTCMonth()، getUTCDay(). فقط "UTC" را بعد از "get" اضافه کنید.

اگر منطقه زمانی شما نسبت به UTC متفاوت باشد، کد پایین ساعت‌های متفاوت را نشان می‌دهد:

// تاریخ کنونی
let date = new Date();

// ساعت در منطقه زمانی کنونی شما
alert( date.getHours() );

// (زمان شهر لندن بدون ساعت تابستانی) UTC+0 ساعت در منطقه زمانی
alert( date.getUTCHours() );

علاوه بر متدهای داده شده، دو متد خاص هم وجود دارند که نوع UTC برای آنها وجود ندارد:

getTime()

برچسب زمان را برای تاریخ برمی‌گرداند – عددی برابر با میلی‌ثانیه‌هایی که از اول ژانویه 1970 میلادی با UTC+0 گذشته است.

getTimezoneOffset()

تقاوت بین UTC و منطقه زمانی محلی را به دقیقه برمی‌گرداند.

// باشید، خروجی 60 می‌دهد UTC-1 اگر شما در منطقه زمانی
// باشید، خروجی 180- می‌دهد UTC+3 اگر در منطقه زمانی
alert( new Date().getTimezoneOffset() );

تنظیم کردن اجزاء تاریخ

متدهای زیر به ما اجازه تنظیم کردن اجزاء تاریخ را می‌دهند:

تمام آنها به جز setTime() یک نوع UTC دارند، برای مثال: setUTCHours().

همانطور که می‌بینیم، بعضی از متدها می‌توانند چند جزء را همزمان تنظیم کنند، برای مثال setHours. اجزائی که ذکر نشوند تغییر داده نمی‌شوند.

برای مثال:

let today = new Date();

today.setHours(0);
alert(today); // .هنوز امروز است اما ساعت به 0 تغییر داده شد
today.setHours(0, 0, 0, 0);
alert(today); // .هنوز هم امروز است، الان ساعت دقیقا 00:00:00 است

تصحیح خودکار

تصحیح خودکار یک خاصیت بسیار کاربردی شیءهای Date است. ما می‌توانیم مقدارهای خارج از محدوده را قرار دهیم و شیء Date به طور خودکار خودش را تنظیم می‌کند.

برای مثال:

let date = new Date(2013, 0, 32); // 32 Jan 2013 ?!?
alert(date); // !برابر است با اول فوریه 2013...

اجزاء خارج از محدوده تاریخ به طور خودکار توزیع می‌شوند.

بیایید فرض کنیم که ما نیاز داریم تاریخ «28 فوریه 2016» را دو روز به جلو ببریم. ممکن است برابر با «دوم مارس» یا اگر سال کبیسه باشد «اول مارس» شود. ما نیازی نداریم که به آن فکر کنیم. فقط 2 روز به آن اضافه کنید. شیء Date بقیه کار را انجام می‌دهد:

let date = new Date(2016, 1, 28);
date.setDate(date.getDate() + 2);

alert( date ); // اول مارس 2016

این ویژگی اغلب برای دریافت تاریخ بعد از مدت زمان داده شده استفاده می‌شود. برای مثال بیایید تاریخ «70 ثانیه پس از الان» را دریافت کنیم:

let date = new Date();
date.setSeconds(date.getSeconds() + 70);

alert( date ); // تاریخ درست را نمایش می‌دهد

همچنین ما می‌توانیم صفر یا مقدارهای منفی را قرار بدهیم. برای مثال:

let date = new Date(2016, 0, 2); // دوم ژانویه 2016

date.setDate(1); // روز اول ماه را تنظیم کنید
alert( date );

date.setDate(0); // کمترین روز 1 است، پس آخرین روز ماه قبل فرض می‌شود
alert( date ); // سی و یک دسامبر 2015

تبدیل تاریخ به عدد، تقاوت تاریخ

زمانی که یک شیء Date به عدد تبدیل می‌شود، در واقع به برچسب زمان تبدیل می‌شود درست مانند date.getTime():

let date = new Date();
alert(+date); // date.getTime() تعداد میلی‌ثانیه‌ها، مانند

اثر جانبی مهم: تاریخ‌ها می‌توانند از هم کم شوند، نتیجه برابر با تفاوت آنها در میلی‌ثانیه است.

می‌توان از آن برای اندازه‌گیری زمان استفاده کرد:

let start = new Date(); // شروع به اندازه‌گیری زمان

// کارتان را انجام دهید
for (let i = 0; i < 100000; i++) {
  let doSomething = i * i * i;
}

let end = new Date(); // اندازه‌گیری زمان را به پایان برسانید

alert( `حلقه ${end - start} میلی‌ثانیه طول کشید` );

متد Date.now()

اگر ما فقط بخواهیم که زمان را اندازه‌گیری کنیم، احتیاجی به شیء Date نداریم.

یک متد خاص Date.now() وجود دارد که برچسب زمان کنونی را برمی‌گرداند.

از لحاظ معنا برابر با new Date().getTime() است اما یک شیء واسطه Date نمی‌سازد. پس سریع‌تر است و به زباله‌روبی فشاری وارد نمی‌کند.

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