رفتار تاریخ و زمان در زبان برنامه نویسی جاوا اسکریپت گاهی اوقات پیچیده و گنگ می‌شود. این پیچیدگی موجب خواهد شد که برنامه نویسان و توسعه‌دهندگان از کتابخانه‌های جاوا اسکریپت مربوطه مانند «Date-fns» و «Moment» در هنگام مدیریت عملیات تاریخ و زمان استفاده کنند. با این حال، استفاده از این کتابخانه‌ها همیشه ضروری نیست و به نوعی راه ساده‌تری برای مدیریت زمان و تاریخ در جاوا اسکریپت وجود دارد که آن هم استفاده از تابع Date در جاوا اسکریپت است که می‌تواند کار با آن ساده باشد.

در این مطلب آموزشی از «مجله فرادرس» می‌خواهیم که در رابطه با تابع Date در جاوا اسکریپت توضیحاتی به زبان ساده ارائه کرده و جنبه‌های مختلف استفاده از این تابع را پوشش دهیم. همچنین در این مطلب انواع روش ایجاد تاریخ، متدهای مربوط به تاریخ و زمان، ایجاد قالب‌های سفارشی تاریخ و زمان، مقایسه زمان‌ها با هم و بسیاری از موارد دیگر پوشش داده می‌شود. کاربران در پایان این مطالعه این مطلب درک جامعی از تابع Date در Javascript و جنبه‌های مختلف دست‌کاری زمان و تاریخ در این زبان خواهند داشت و می‌توانند با آن کار کنند.

تابع Date در جاوا اسکریپت چیست؟

در جاوا اسکریپت، وقتی در مورد تاریخ صحبت می‌کنیم، اساساً واحدهای کوچکی به نام میلی‌ثانیه را از نقطه شروعی که به عنوان دوره «EcmaScript» شناخته می‌شود، می‌شماریم. این نقطه شروع همان زمان تولد جاوا اسکریپت است که در «۱ ژانویه ۱۹۷۰» (٩ شهريور ۱۳۴۹) در منطقه زمانی به نام «ساعت هماهنگ جهانی» (UTC) اتفاق افتاد. همین لحظه شروع به عنوان نقطه مرجع در رایانه‌ها برای پیگیری تاریخ و زمان نیز استفاده می‌شود. در اصل تابع Date در جاوا اسکریپت به روش‌ها و عملیات داخلی اشاره دارد که امکان دستکاری، قالب‌بندی و مقایسه مقادیر تاریخ و زمان را ارائه می‌دهد.

ایجاد تاریخ در جاوا اسکریپت

در زبان برنامه نویسی جاوا اسکریپت می‌توان با استفاده از دستور new Date()

تاریخی جدید ایجاد کرد. چهار روش مختلف برای استفاده از new Date()

وجود دارد که به ‌صورت موارد زیر هستند:

  • با ارائه رشته date
  • با استفاده از آرگومان‌های مرتبط با تاریخ
  • با استفاده از مهر زمانی
  • ایجاد تاریخ بدون آرگومان
برنامه نویس پشت کامپیوتر - ایجاد تاریخ در جاوا اسکریپت

همچنین چهار رویکرد برای ایجاد نمونه تاریخ وجود دارد که این رویکردها به‌صورت زیر هستند:

  • new Date()

  • new Date(milliseconds)
  • new Date(Date string)
  • new Date(year, month, day, hours, minutes, seconds, milliseconds)

استفاده از رویکرد رشته Date برای تعیین تاریخ در جاوا اسکریپت

هنگام استفاده از رویکرد رشته Date در جاوا اسکریپت، با وارد کردن نوعی «رشته» (استرینگ | String) Date

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

new Date('1988-03-21')

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

تمایل پیدا می‌کنند و این نوعی عادت برنامه نویسی رایج است. برای مثال، اگر کاربری بنویسد «۲۱-۰۳-۱۹۸۸»، کاربران دیگر بدون متوجه می‌شوند که این تاریخ نشان‌دهنده ٢١ مارس ١٩٨٨ است. با این حال، در جاوا اسکریپت، درج مثلاً «۲۱-۰۳-۱۹۸۸» نوعی نتیجه «تاریخ نامعتبر» (Invalid Date) به کاربر نشان می‌دهد که دلیلی منطقی پشت این رفتار نهفته است.

new Date('21-03-1988') returns Invalid Date.

تفاسیر تاریخ در مناطق مختلف جهانی متفاوت است. برای مثال نمونه تاریخ «۱۱-۰۶-۲۰۱۹» را در نظر بگیرید، بسته به کنوانسیون تاریخ منطقه‌ای، این تاریخ می‌تواند به معنای ۱۱ ژوئن یا ۶ نوامبر باشد. این ابهام تا زمانی که سیستم تاریخ مورد استفاده مشخص نباشد همچنان باقی خواهد ماند. در جاوا اسکریپت، استفاده از رشته Date

مستلزم پایبندی به نوعی قالب شناخته شده جهانی است. یکی از این قالب‌های رایج، قالب تاریخ و زمان «ISO 8601 Extended» به‌حساب می‌آید که به صورت زیر است.

// ISO 8601 Extended format
`YYYY-MM-DDTHH:mm:ss.sssZ`

تفسیر قالب تاریخ و زمان ISO 8601

در این بخش به تفکیک قالب رایج «ISO 8601 Extended» می‌پردازیم. این قالب به صورت زیر مفروض است:

// ISO 8601 Extended format
`YYYY-MM-DDTHH:mm:ss.sssZ`

در زیر تفکیک اجزای این قالب تاریخ و زمان آمده است:

  • YYYY

    : سال ۴ رقمی

  • MM

    : ماه ۴ رقمی (ژانویه به عنوان ۰١، دسامبر به عنوان ١٢)

  • DD

    : روز ۴ رقمی (از ۰ تا ٣١)

  • : جداکننده‌های تاریخ

  • T

    : نشان‌دهنده شروع زمان

  • HH

    : ساعت ٢ رقمی در قالب ۲۴ ساعته (۰ تا ٢۳)

  • mm

     : دقیقه (۰ تا ۵٩)

  • ss

    : ثانیه (۰ تا ۵٩)

  • sss

    : میلی‌ثانیه (۰ تا ٩٩٩)

  • :

    : جداکننده‌های زمان

  • Z

    : وجود آن نشان‌دهنده UTC و نبود آن به معنای زمان محلی است (در صورت ارائه زمان).

ساعت زرد روی دیوار

هنگام ایجاد تاریخ، گنجاندن ساعت، دقیقه، ثانیه و میلی‌ثانیه اختیاری است. بنابراین، برای ایجاد تاریخ برای مثال ١١ ژوئن ٢۰١٩، می‌توان از: new Date (‘2019-06-11’)

استفاده کرد.

معایب رویکرد رشته Date در جاوا اسکریپت

با وجود همه مزایایی که رویکرد رشته Date در جاوا اسکریپت در ایجاد تاریخ و زمان دارد یک سری انتقادات نیز به آن وارد است. هنگام ساختن تاریخ‌ها با رشته‌های تاریخ مشکلی مهم وجود دارد که هنگام ثبت تاریخ این مشکل آشکار می‌شود. برای مثال در نمونه تاریخ بالا برای مناطق زمانی که زمان آن‌ها از زمان گرینویچ (GMT) عقب است، تاریخ ایجاد شده ١۰ ژوئن را نشان می‌دهد. برعکس، اگر قبل از GMT قرار داشته باشد، تاریخ به عنوان ١١ ژوئن نمایش داده می‌شود.

این ویژگی به این دلیل به وجود می‌آید که در این مورد خاص تاریخ رشته به شیوه‌ای غیرعادی رفتار می‌کند. وقتی تاریخ بدون تعیین زمان، مشخص شود، به طور پیش‌فرض روی UTC قرار می‌گیرد. در مثال قبلی، (‘2019-06-11’)

به طور مؤثر تاریخ ١١ ژوئن ٢۰١٩، ساعت ١٢:۰۰ در UTC را می‌سازد. در نتیجه، افرادی که در مناطق قبل از GMT زندگی می‌کنند، به‌جای ١١ ژوئن، ١۰ ژوئن را دریافت خواهند کرد.

برای ایجاد تاریخ در زمان محلی به وسیله روش رشته Date در جاوا اسکریپت، باید بخش زمانی را وارد کرد. برای اطمینان از دقت، حداقل باید HH

به معنای ساعت و mm

به معنای دقیقه را ارائه داد، در غیر این صورت ممکن است برای مثال مرورگر گوگل کروم تاریخ نامعتبری را بازگرداند. به عنوان مثال تاریخ زیر مفروض است:

('2019-06-11T00:00')

دوگانگی بین زمان محلی و UTC هنگام برخورد با رشته‌های تاریخ می‌تواند موجب ایجاد خطاهای پنهان شود. برای کاهش این خطاها، توصیه می‌شود که از رویکرد ایجاد تاریخ مبتنی بر رشته Date

خودداری شود. همچنین توجه به این نکته مهم است که «شبکه توسعه‌دهندگان موزیلا فایرفاکس» (Mozilla Developer Network) به دلیل تفاوت در نحوه تفسیر رشته‌های Date

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

استفاده از آرگومان های تاریخ در جاوا اسکریپت

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

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

  • سال: نمایش ۴ رقمی سال.
  • ماه: عددی که ماه را نشان می‌دهد (١١-۰). این اندیس در حالت پیش‌فرض صفر بوده و صفر مربوط به ماه ژانویه است. در صورت عدم ارائه به صورت پیش‌فرض مقدار ۰ لحاظ می‌شود.
  • روز: نشان‌دهنده روز ماه (٣١-١) است. در صورت عدم ارائه به صورت پیش‌فرض مقدار آن ١ در نظر گرفته می‌شود.
  • ساعت: نشان‌دهنده ساعت روز است (٢٣-۰). در صورت عدم ارائه به صورت پیش‌فرض ۰ در نظر گرفته خواهد شد.
  • دقیقه: بیانگر دقیقه (۵٩-۰) است. در صورت عدم ارائه به صورت پیش‌فرض ۰ در نظر می‌شود.
  • ثانیه: ثانیه‌ها (۵٩-۰) را مشخص می‌کند. در صورت عدم ارائه به صورت پیش‌فرض ۰ به آن اختصاص می‌شود.
  • میلی‌ثانیه: این آرگومان میلی‌ثانیه‌ها را توصیف می‌کند (٩٩٩-۰). در صورت عدم ارائه به صورت پیش‌فرض ۰ در نظر می‌شود. مثال زیر نحوه استفاده از این رویکرد ایجاد تاریخ در جاوا اسکریپت را نشان می‌دهد:
// 11th June 2019, 5:23:59am, Local Time
new Date(2019, 5, 11, 5, 23, 59)

بسیاری از توسعه‌دهندگان در ابتدا از رویکرد مبتنی بر آرگومان به دلیل پیچیدگی «سینتکس» (Syntax) آن اجتناب می‌کنند ولی با این حال این رویکرد خیلی ساده به‌حساب می‌آید. برای استفاده از این روش کافی است که خواندن اعداد مرتبط با زمان را از چپ به راست تمرین و آن را به عادتی تبدیل کرد. با خواند این اعداد و ارقام از چپ به راست، مقادیر به ترتیب اهمیتشان وارد برنامه می‌شوند، برای مثال این اولویت‌ها از بالا به پایین به صورت زیر هستند:

  • سال
  • ماه
  • روز
  • ساعت
  • دقیقه
  • ثانیه
  • میلی‌ثانیه
برنامه نویس در حال کار کد نویسی - آرگومان های تاریخ در جاوا اسکریپت

مثال زیر نحوه استفاده از این رویکرد را نشان می‌دهد:

new Date(2017, 3, 22, 5, 23, 50)
// Interpretation:
// Year: 2017
// Month: April (since months are zero-indexed)
// Date: 22
// Hours: 05
// Minutes: 23
// Seconds: 50

یکی از جنبه‌های قابل توجه تابع Date در جاوا اسکریپت این است که مقدار ماه آن از اندیس‌سازی مبتنی بر صفر استفاده می‌کند. این بدان معناست که ماه ژانویه به صورت ۰، فوریه به عنوان ١، مارس به عنوان ٢ و غیره نمایش داده می‌شوند. در زیر مثال‌های بیشتری برای آشنایی با این رویکرد آورده شده است:

// 21st March 1988, 12am, Local Time.
new Date(1988, 2, 21)

// 25th December 2019, 8am, Local Time.
new Date(2019, 11, 25, 8)

// 6th November 2023, 2:20am, Local Time.
new Date(2023, 10, 6, 2, 20)

// 11th June 2019, 5:23:59am, Local Time.
new Date(2019, 5, 11, 5, 23, 59)

باید به این نکته توجه داشت که تاریخ‌هایی که با استفاده از آرگومان‌ها ساخته شده‌اند، همه در زمان محلی هستند. این کار سردرگمی بین زمان محلی و «ساعت جهانی هماهنگ» (UTC) را دور می‌زند و کار برنامه‌نویس را راحت می‌کند، با این حال اگر کاربری به تاریخ مبتنی بر UTC نیاز داشته باشد، می‌تواند آن را به صورت زیر ایجاد کند:

// 11th June 2019, 12am, UTC.
new Date(Date.UTC(2019, 5, 11))

ایجاد تاریخ با مهر زمانی

در جاوا اسکریپت، مهر زمانی نشان دهنده مدت‌زمان برحسب میلی‌ثانیه است که از ۱ ژانویه ۱۹۷۰ اتفاق افتاده است که این زمان به عنوان زمان دوره «یونیکس» (Unix) نیز شناخته می‌شود. در عمل، مهرهای زمانی به ندرت برای شروع تاریخ استفاده می‌شوند. در عوض، هدف آن‌ها مقایسه تاریخ‌ها با یکدیگر است. مثال زیر در این رابطه اهمیت زیادی دارد.

// 11th June 2019, 8am (in my Local Time, Singapore)
new Date(1560211200000)

ایجاد تاریخ در جاوا اسکریپت بدون آرگومان

هنگامی که تاریخی بدون هیچ‌گونه آرگومان ایجاد شود، منجر به ساخت تاریخی خواهد شد که زمان کنونی را منعکس می‌کند و با زمان محلی تنظیم می‌شود. مثال زیر برای بیان این نوع تاریخ در جاوا اسکریپت است.

new Date()

خروجی قطعه کد بالا مربوط به زمان فعلی و به صورت زیر است.

ایجاد تاریخ در جاوا اسکریپت بدون آرگومان

از خروجی بالا می‌توان متوجه شد که تاریخ ٣۰ ماه آگوست و ساعت ١٢:٣٧:٣٣ به وقت ایران است.

مثالی برای new Date(milliseconds)

این بخش مربوط به ارائه مثالی برای استفاده از میلی‌ثانیه برای ایجاد تاریخ است. تابع Date در جاوا اسکریپت شامل نوعی مقدار عددی است که با تعداد میلی‌ثانیه از ١ ژانویه ١٩٧۰ در زمان هماهنگ جهانی (UTC) مطابقت دارد. با فراخوانی new Date(milliseconds)

نوعی شی Date

تازه با افزودن تعدادی مشخص شده میلی‌ثانیه به نقطه مرجع زمان صفر، تشکیل می‌شود. مانند مثال زیر:

const time1 = new Date(0);

// epoch time
console.log(time1); // Thu Jan 01 1970 05:30:00

// 100000000000 milliseconds after the epoch time
const time2 = new Date(100000000000)
console.log(time2); // Sat Mar 03 1973 15:16:40

باید به این نکته توجه داشت که ١۰۰۰ میلی‌ثانیه برابر با ١ ثانیه است.

مثالی برای ایجاد تاریخ با رشته Date

همان‌طور که گفته شد تابع Date در جاوا اسکریپت بر اساس رشته Date

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

١. از فرمت تاریخ ISO می‌توان در حالت معمولی استفاده کرد. این قالب تاریخ در بالا هم بحث شد و کاربران می‌توانند شی Date

را با این فرمت ایجاد کنند که مثال زیر برای بیان این مفهوم است.

// ISO Date (International Standard)
const date = new Date("2020-07-01");

// The resulting date corresponds to UTC
console.log(date); // Wed Jul 01 2020 05:45:00 GMT+0545

٢. علاوه بر این، می‌توان فقط سال و ماه یا فقط سال را مانند مثال زیر به آن وارد کرد:

const date = new Date("2020-07");
console.log(date); // Wed Jul 01 2020 05:45:00 GMT+0545

const date1 = new Date("2020");
console.log(date1); // Wed Jul 01 2020 05:45:00 GMT+0545

٣. همچنین زمان‌های مشخصی را نیز می‌توان به تاریخ‌های ISO به صورت زیر اضافه کرد.

const date = new Date("2020-07-01T12:00:00Z");
console.log(date); // Wed Jul 01 2020 17:45:00 GMT+0545

باید به این نکته توجه کرد که در قالب‌های تاریخ ISO، تاریخ و زمان با استفاده از حرف T

بزرگ از هم جدا می‌شوند. علاوه بر این، ساعت جهانی هماهنگ (UTC) با حرف بزرگ Z

مشخص می‌شود.

قالب تاریخ کوتاه و بلند

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

١. قالب تاریخ کوتاه « MM/DD/YYYY

»:

در قالب تاریخ کوتاه، تاریخ‌ها به صورت « MM/DD/YYYY

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

const date = new Date("03/25/2015");
console.log(date); // Wed Mar 25 2015 00:00:00 GMT+0545

٢. قالب تاریخ بلند « MMM DD YYYY

»:

قالب تاریخ بلند از ساختار « MMM DD YYYY

» پیروی می‌کند که در آن پارامترهای ماه با استفاده از مخفف سه‌حرفی و به دنبال آن روز و سال نشان داده می‌شود. مثال این قالب تاریخ و زمان به صورت زیر است:

const date1 = new Date("Jul 1 2020");
console.log(date1); // Wed Jul 01 2020 00:00:00 GMT+0545

const date2 = new Date("1 Jul 2020");
console.log(date2); // Wed Jul 01 2020 00:00:00 GMT+0545

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

const date1 = new Date("Jul 1 2020");
console.log(date1); // Wed Jul 01 2020 00:00:00 GMT+0545

const date2 = new Date("1 Jul 2020");
console.log(date2); // Wed Jul 01 2020 00:00:00 GMT+0545

مثال ایجاد تاریخ با اطلاعات دقیق

تابع new Date(year, month, day, hours, minutes, seconds, milliseconds)

ایجاد شی Date

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

const time1 = new Date(2020, 1, 20, 4, 12, 11, 0);
console.log(time1); // Thu Feb 20 2020 04:12:11

١. هنگامی که چهار مقدار عددی ارائه می‌شود، سال، ماه، روز و ساعت را نشان می‌دهد. مانند مثال زیر:

const time1 = new Date(2020, 1, 20, 4);
console.log(time1); // Thu Feb 20 2020 04:00:00

٢. به همین ترتیب، دو آرگومان مربوط به سال و ماه خواهند بود مانند مثال زیر:

const time1 = new Date(2020, 1);
console.log(time1); // Sat Feb 01 2020 00:00:00

توجه به این نکته مهم است که اگر تنها یک آرگومان ارائه شود این آرگومان به میلی‌ثانیه تفسیر می‌شود. برای استفاده از این قالب تاریخ حتماً دو آرگومان لازم است.

ساعت آنالوگ روی مانیتور با یک کیبورد روی میز - تابع date در جاوا اسکریپت

متدهای تابع Date در جاوا اسکریپت

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

  • now()

    : مقدار عددی مربوط به زمان حال را بازیابی می‌کند (میلی‌ثانیه از ١ ژانویه ١٩٧۰).

  • getFullYear()

    : سال جاری را بر اساس زمان محلی واکشی می‌کند.

  • getMonth()

    : ماه را بازیابی می‌کند که به صورت مقداری از ۰ تا ١١، مطابق با زمان محلی نمایش داده می‌شود.

  • getDate()

    : روز ماه (از ١ تا ٢١) را بر اساس زمان محلی بازیابی خواهد کرد.

  • getDay()

    : روز هفته (از ۰ تا ٦) را بر اساس زمان محلی واکشی می‌کند.

  • getHours()

    : ساعت (۰ تا ٢٣) را بر اساس زمان محلی مورد بازیابی قرار می‌دهد.

  • getMinutes()

    : دقیقه (۰ تا ۵٩) را بر اساس زمان محلی واکشی می‌کند.

  • getUTCDate()

    : روز ماه (١ تا ٣١) را بر اساس زمان هماهنگ جهانی (UTC) بازیابی می‌کند.

  • setFullYear()

    : کل سال را بر اساس زمان محلی تنظیم خواهد کرد.

  • setMonth()

    : ماه را بر اساس زمان محلی تنظیم می‌کند.

  • setDate()

    : روز ماه را بر اساس زمان محلی تنظیم خواهد کرد.

  • setUTCDate()

    : روز ماه را بر اساس زمان هماهنگ جهانی (UTC) تنظیم می‌کند.

مثالی برای استفاده از متدهای تاریخ و زمان در جاوا اسکریپت به صورت زیر است:

const timeInMilliseconds = Date.now();
console.log(timeInMilliseconds); // 1593765214488

const time = new Date;

// get day of the month
const date = time.getDate();
console.log(date); // 30

// get day of the week
const year = time.getFullYear();
console.log(year); // 2020

const utcDate = time.getUTCDate();
console.log(utcDate); // 30

const event = new Date('Feb 19, 2020 23:15:30');
// set the date
event.setDate(15);
console.log(event.getDate()); // 15

// Only 28 days in February!
event.setDate(35);

console.log(event.getDate()); // 7

قالب‌ بندی تاریخ در جاوا اسکریپت

در بسیاری از زبان‌های برنامه‌ نویسی، ابزار داخلی برای قالب‌بندی تاریخ‌ها به قالب‌های دلخواه مختلف وجود دارد. به عنوان مثال، در زبان برنامه نویسی PHP، می‌توان از قالب date(“d M Y”)

برای به دست آوردن قالبی مانند 23 Jan 2019

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

مثال زیر در رابطه با قالب‌بندی تاریخ در جاوا اسکریپت مهم است:

const date = new Date(2019, 0, 23, 17, 23, 42);

date.toString();               // Gives: Wed Jan 23 2019 17:23:42 GMT+0800 (Singapore Standard Time)
date.toDateString();           // Gives: Wed Jan 23 2019
date.toLocaleString();         // Gives: 23/01/2019, 17:23:42
date.toLocaleDateString();     // Gives: 23/01/2019
date.toGMTString();            // Gives: Wed, 23 Jan 2019 09:23:42 GMT
date.toUTCString();            // Gives: Wed, 23 Jan 2019 09:23:42 GMT
date.toISOString();            // Gives: 2019-01-23T09:23:42.079Z

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

برنامه نویس در حال بررسی کدها پشت سیستم - شی Date در جاوا اسکریپت

تصحیح شی Date در جاوا اسکریپت

در کار با تابع Date در جاوا اسکریپت، اگر کاربر مقادیری را تخصیص دهد که فراتر از محدوده معتبر باشد، شی Date

به طور خودکار خود را اصلاح می‌کند. مثال زیر بیانگر این موضوع است:

const date = new Date(2008, 0, 33);
// January does not have 33 days

console.log(date);

خروجی سناریوی بالا به صورت زیر است:

Sat Feb 02 2008

در سناریوی، هنگام تلاش برای تنظیم تاریخ به روز ٣٣ ژانویه، شی Date

به طور خودکار ماه و روز را به ترکیبی معتبر تنظیم می‌کند که منجر به ٢ فوریه ٢۰۰٨ می‌شود.

ایجاد قالب تاریخ سفارشی در جاوا اسکریپت

فرض کنید قالبی مانند Thu, 23 January 2019

را می‌خواهیم. دستیابی به این امر مستلزم استفاده از متدهای ارائه شده برای شی Date در جاوا اسکریپت است. برای به دست آوردن مقادیر موردنیاز، می‌توان از چهار متد زیر استفاده کرد:

  1. « getFullYear

    »: سال ۴ رقمی را بر اساس زمان محلی بازیابی می‌کند.

  2. « getMonth

    »: ماه سال (١١-۰) را بر اساس زمان محلی بازیابی می‌کند. ماه‌ها با اندیس صفر شروع می‌شوند.

  3. « getDate

    »: روز ماه (٣١-١) را بر اساس زمان محلی واکشی می‌کند.

  4. « getDay

    »: روز هفته (٦-۰) را بر اساس زمان محلی بازیابی می‌کند، جایی که یکشنبه ۰ و شنبه ٦ است.

ایجاد مقادیر ٢٣ و ٢۰١٩ برای Thu, 23 January 2019

با استفاده از « getFullYear

» و « getDate

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

const d = new Date(2019, 0, 23)
const year = d.getFullYear() // 2019
const date = d.getDate() // 23

با این حال، بازیابی Thu

و January

به فرآیند پیچیده‌تری نیاز دارد. ایجاد ماه January

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

const months = [
  'January', 'February', 'March', 'April', 'May', 'June',
  'July', 'August', 'September', 'October', 'November', 'December'
];

حال برای به دست آوردن January

باید به صورت زیر عمل کرد:

  • از « getMonth

    » برای به دست آوردن ماه باید از اندیس صفر برای شروع ماه‌ها استفاده کرد.

  • نام ماه باید از آرایه بالا واکشی شود. که قطعه کد انجام این کار به صورت زیر است:
const monthIndex = d.getMonth();
const monthName = months[monthIndex];
console.log(monthName); // January

نسخه مختصرتر کد بالا به صورت زیر است:

The more concise version:

رویکردی مشابه را می‌توان برای بازیابی Thu

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

const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];

حال برای بازیابی Thu

باید به صورت زیر عمل کرد:

  • به دست آوردن dayIndex

    با استفاده از getDay

  • به دست آوردن dayName

    با استفاده از dayIndex

قطعه کد انجام این کار به صورت زیر است:

const dayIndex = d.getDay();
const dayName = days[dayIndex]; // Thu

نسخه مختصرتر انجام این فرایند مطابق کد زیر است:

const dayName = days[d.getDay()]; // Thu

با ادغام این متغیرها، می‌توان رشته فرمت شده موردنظر را به صورت زیر ایجاد کرد:

const formatted = `${dayName}, ${date} ${monthName} ${year}`;
console.log(formatted); // Thu, 23 January 2019

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

ساعت آنالوگ زردرنگ

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

  • getHours

    : ساعت‌ها (٢٣-۰) را بر اساس زمان محلی بازیابی می‌کند.

  • getMinutes

    : دقیقه (۵٩-۰) را بر اساس زمان محلی واکشی می‌کند.

  • getSeconds

    : ثانیه‌ها (۵٩-۰) را بر اساس زمان محلی بازیابی خواهد کرد.

  • getMilliseconds

    : میلی‌ثانیه (٩٩٩-۰) را بر اساس زمان محلی مورد بازیابی قرار می‌دهد.

مقایسه زمان ها در جاوا اسکریپت

مقایسه تاریخ‌ها در جاوا اسکریپت با استفاده از عملگرهای «>» و «<» ،«>=» ،«<=»

امکان‌پذیر است که مثال زیر نحوه انجام این مقایسه‌ها را نشان می‌دهد:

const earlier = new Date(2019, 0, 26);
const later = new Date(2019, 0, 27);

console.log(earlier < later); // true

ارزیابی اینکه دو تاریخ دقیقاً چه رابطه‌ای باهم دارند حاوی پیچیدگی‌های خاص خود است و استفاده از « ==

» یا « ===

» برای مقایسه برابری این تاریخ‌ها روشی کاملاً مؤثر به‌حساب نمی‌آید.

const a = new Date(2019, 0, 26);
const b = new Date(2019, 0, 26);

console.log(a == b);    // false
console.log(a === b);   // false

برای تعیین اینکه آیا دو تاریخ دقیقاً بر هم منطبق هستند یا خیر، می‌توان با استفاده از getTime

مهرهای زمانی آن‌ها را بررسی کرد که مثال زیر نحوه انجام این کار را نشان می‌دهد:

const isSameTime = (a, b) => {
  return a.getTime() === b.getTime();
};

const a = new Date(2019, 0, 26);
const b = new Date(2019, 0, 26);
console.log(isSameTime(a, b)); // true

برای بررسی اینکه آیا دو تاریخ در یک روز قرار دارند، مقادیر getFullYear

، getMonth

و getDate

آن‌ها باید مانند مثال زیر مورد ارزیابی قرار بگیرد:

const isSameDay = (a, b) => {
  return a.getFullYear() === b.getFullYear() &&
         a.getMonth() === b.getMonth() &&
         a.getDate() === b.getDate();
};

const a = new Date(2019, 0, 26, 10); // 26 Jan 2019, 10am
const b = new Date(2019, 0, 26, 12); // 26 Jan 2019, 12pm
console.log(isSameDay(a, b)); // true

گرفتن تاریخ از تاریخی دیگر در جاوا اسکریپت

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

  • تنظیم مقدار تاریخ و زمان خاص با استفاده از اطلاعات تاریخ دیگری
  • افزودن یا تفریق یک فاصله زمانی خاص از تاریخ دیگری یا به اصطلاح افزودن یا تفریق مقدار دلتا از تاریخی خاص

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

تنظیم زمان و تاریخ خاص از اطلاعات تاریخی دیگر

می‌توان با تنظیم مقدار خاصی از تاریخ و زمان که از تاریخ و زمانی دیگری گرفته شده است تاریخی جدید تنظیم کرد که از اطلاعات زیر استفاده می‌کند:

  • « setFullYear

    »: سال ۴ رقمی را در زمان محلی تنظیم می‌کند.

  • « setMonth

    »: ماه سال را به وقت محلی تغییر می‌دهد.

  • « setDate

    »: روز ماه را به وقت محلی تغییر خواهد داد.

  • « setHours

    »: ساعت‌ها را در زمان محلی تنظیم می‌کند.

  • « setMinutes

    »: دقیقه‌ها را در زمان محلی تنظیم خواهد کرد.

  • « setSeconds

    »: ثانیه‌ها را در زمان محلی تغییر می‌دهد.

  • « setMilliseconds

    »: میلی‌ثانیه‌ها را در زمان محلی به‌روز می‌کند.

به عنوان مثال، برای تعیین تاریخ برای پانزدهمین روز ماه، می‌توان از setDate(15)

به صورت زیر استفاده کرد:

const d = new Date(2019, 0, 10);
d.setDate(15);

console.log(d); // 15 January 2019

برای تنظیم ماه به عنوان مثال روی ژوئن، از setMonth

استفاده می‌شود و باید این نکته را یادآوری کرد که ماه‌ها در جاوا اسکریپت دارای اندیس صفر هستند.

const d = new Date(2019, 0, 10);
d.setMonth(5);

console.log(d); // 10 June 2019

همچنین باید به این نکته توجه داشت که متدهای تنظیم کننده، Date در جاوا اسکریپت را تغییر می‌دهند. در عمل، تغییر این شی توصیه نمی‌شود . بهتر است به‌جای این کار، این عملیات را روی شی Date

جدیدی به صورت زیر انجام داد:

const d = new Date(2019, 0, 10);
const newDate = new Date(d);
newDate.setMonth(5);

console.log(d);       // 10 January 2019
console.log(newDate); // 10 June 2019

افزودن یا تفریق مقدار دلتا از تاریخی دیگری

رویکرد دیگری برای ایجاد تاریخی جدید از تاریخی دیگر که در کار با شی یا توابع Date در جاوا اسکریپت باید به آن اهمیت داد، رویکرد افزودن یا تفریق یک فاصله زمانی خاص از تاریخ دیگر است. وقتی به اضافه یا تفریق دلتایی از تاریخ دیگری اشاره می‌کنیم، اساساً منظور از آن تغییر زمان است. این دلتا می‌تواند افزایش‌های مختلفی مانند سال، ماه، روز و موارد دیگر را نشان دهد. برای رسیدن به این هدف، می‌توان از مؤلفه‌های تاریخ زیر استفاده کرد:

  • « getFullYear

    »: سال ۴ رقمی را با توجه به زمان محلی بازیابی می‌کند.

  • « getMonth

    »: ماه سال (۱۱-۰) را بر اساس زمان محلی واکشی خواهد کرد.

  • « getDate

    »: روز ماه (۳۱-۱) را بر اساس زمان محلی بازیابی می‌کند.

  • « getHours

    »: ساعت (۲۳-۰) را به وقت محلی مورد بازیابی قرار می‌دهد.

  • « getMinutes

    »: دقیقه‌ها (۵۹-۰) را به وقت محلی بازیابی می‌کند.

  • « getSeconds

    »: ثانیه‌ها (۵۹-۰) را به وقت محلی واکشی خواهد کرد.

  • « getMilliseconds

    »: میلی‌ثانیه‌ها (۹۹۹-۰) را به وقت محلی بازیابی می‌کند.

دو روش اصلی برای اضافه یا تفریق یک دلتا از تاریخ وجود دارد. رویکرد اول در پلتفرم‌هایی مانند «Stack Overflow» بیشتر مورد استفاده قرار می‌گیرد. این رویکرد مختصر است اما در عین حال درک آن کمی چالش‌برانگیز به‌حساب می‌آید. از سوی دیگر، رویکرد دوم طولانی‌تر اما شهودی‌تر است. در ادامه هر دو رویکرد را با استفاده از مثالی برای به دست آوردن تاریخی که سه روز جلوتر از تاریخی فرضی، مرور خواهیم کرد.

برنامه نویس در حال تایپ

رویکرد Set برای تنظیم تاریخ در جاوا اسکریپت

کار با مثالی شروع خواد شد و بفرض بر این است که تاریخ امروز ٢٨ مارس ٢۰١٩ است. حال رویکرد اول برای این فرض به صورت زیر خواهد بود:

const today = new Date(2019, 2, 28);

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

const finalDate = new Date(today);

در مرحله بعد، کاربر باید مقداری را که قصد تغییر آن را دارد تعیین کند. همان‌طور که در این مثال خاص کاربر با روزها سروکار دارد، می‌تواند روز جاری را با استفاده از متد getDate

به دست آورد:

const currentDate = today.getDate();

حال هدف کاربر این است که تاریخ سه روز بعد را از تاریخ امروز بازیابی کند و برای این هدف باید کاربر دلتایی با مقدار 3 را به تاریخ فعلی اضافه کند:

finalDate.setDate(currentDate + 3);

کد کامل رویکرد اول به صورت زیر است:

const today = new Date(2019, 2, 28);
const finalDate = new Date(today);
finalDate.setDate(today.getDate() + 3);

console.log(finalDate); // 31st March 2019

این رویکرد مستقیماً شی finalDate

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

رویکرد new Date برای تنظیم تاریخ در جاوا اسکریپت

حال رویکرد دوم هم با فرض همان تاریخ قبلی تشریح خواهد شد.

const today = new Date(2019, 2, 28);

این کار با استخراج مقادیر اساسی سال، ماه و روز به صورت زیر شروع خواهد شد.

const today = new Date(2019, 2, 28);

با در دست داشتن این مقادیر، می‌توان شی Date جدید ساخت و روز را با افزودن مقدار ٣ به صورت زیر تنظیم کرد:

const finalDate = new Date(year, month, day + 3);

کد کامل این رویکرد به صورت زیر است:

const today = new Date(2019, 2, 28)

// Getting required values
const year = today.getFullYear()
const month = today.getMonth()
const day = today.getDate()

// Creating a new Date (with the delta)
const finalDate = new Date(year, month, day + 3)

console.log(finalDate) // 31 March 2019

هر دو رویکرد نتیجه یکسانی دارند. انتخاب بین آن‌ها بستگی به ترجیحات و نیازهای کدنویسی کاربر دارد. این تکنیک‌ها انعطاف‌پذیری را در تنظیم تاریخ‌ها بر اساس نیاز کاربر فراهم می‌کنند و استفاده از آن‌ها با توابع Date در جاوا اسکریپت از اهمیت بالایی برخوردار است.

تصحیح خودکار تاریخ در جاوا اسکریپت چگونه انجام میشود؟

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

فرض بر این است اگر کاربری سعی کند تاریخ را به عنوان ۳۳ مارس ۲۰۱۹ تنظیم کند چه اتفاقی می‌افتد؟ از آنجا که ماه مارس فقط ۳۱ روز دارد، جاوا اسکریپت به طور خودکار تاریخ را به ۲ آوریل تنظیم می‌کند که مثال زیر این مفهوم را نشان می‌دهد:

// 33rd March => 2nd April
new Date(2019, 2, 33);

در مثال فوق تاریخ ٣٣ مارس به طور خودکار به ٢ آوریل تبدیل می‌شود و این ویژگی قابلیت ذاتی جاوا اسکریپت برای تصحیح خودکار تاریخ را نشان می‌دهد. این ویژگی هنگام کار با دلتاهای تاریخ، نیاز به محاسبات دستی شامل دقیقه، ساعت، روز، ماه و موارد دیگر را از بین می‌برد و با افزودن مقدار دلتای خاصی به تاریخ مد نظر، جاوا اسکریپت بدون زحمت تنظیمات خودکار را مدیریت می‌کند. به عنوان مثال، این مثال را در نظر بگیرید که در آن کاربر سعی می‌کند ٣ روز به ٣۰ مارس اضافه کند:

// 30 + 3 = 33. 33rd March => 2nd April
new Date(2019, 2, 30 + 3);

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

سخن پایانی

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

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

نوشته تابع Date در جاوا اسکریپت – آنچه باید درباره کار با تاریخ و زمان بدانید اولین بار در فرادرس – مجله‌. پدیدار شد.

source

توسط blogcheck