توضیحات

دیت آبجکت در حقیقت یک کلاس ES6 هست که من برای راحت شدن کار با انواع تقویم ها نوشتم تا برای هر تقویم لازم نباشه یک پکیج جدا را در دیت پیکر ایمپورت کنم.

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

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

تولید تاریخ همین لحظه

برای تولید یک نمونه از DateObject باید از کد ()new DateObject استفاده کنید. اگر کد بالا رو بدون هیچ کانستراکتوری وارد کنید براتون یک نمونه از DateObject با تقویم میلادی (gregorian) و locale انگلیسی (en) ساخته میشه مثلا برای امروز که به میلادی 2021/01/14 هست اگر من یک ()new DateObject تعریف کنم، یک نمونه از همین تاریخ برای من تولید میشه:

const date = new DateObject()

console.log(date.year) //2021
console.log(date.month.number) //3
console.log(date.day) //2
console.log(date.calendar) //gregorian
console.log(date.locale) //en

حالا میتونید با متد format تاریخ خودتون رو فرمت کنید :

console.log(date.format()) //2021/03/02

همچنین اگر توکن خاصی مد نظرتون هست میتونید داخل متد فرمت اون token رو به صورت پارامتر وارد کنید:

console.log(date.format("dddd DD MMMM YYYY")) //Tuesday 02 March 2021

و اگر داخل توکن هاتون از مقداری استفاده میکنید که میخواید ignore شه ، اون مقادیر را به صورت آرایه در پارامتر دوم تعریف کنید:

console.log(
  date.format(
    "Date: YYYY/MM/DD Time: HH:mm:ss",
    ["Date", "Time"]
  )
) //Date: 2021/03/02 Time: 10:53:00

همونطور که میدونید شما میتونید مقدار های مورد نظرتون رو از تاریخ تولید شده استخراج کنید:

const {year, month, day, hour, minute} = date

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

const {name, shortName, number, index} = date.month

console.log(name, shortName, number, index); //March Mar 3 2
const {name, shortName, number, index} = date.weekDay

console.log(name, shortName, number, index); //Tuesday Tue 3 2

اگر میخواهید به اول و آخر ماه حرکت کنید از متد های ()toFirstOfMonth و ()toLastOfMonth استفاده کنید.

date.toFirstOfMonth()

console.log(date.format()); //2021/03/01

date.toLastOfMonth()

console.log(date.format()); //2021/03/31

اضافه / کم کردن زمان از لحظه اصلی

بسته به افزایش یا کاهش دادن زمان از زمان اصلی، میتوان از متد های add یا subtract استفاده کرد.

به اینصورت که باید دو پارامتر مقدار و کلید را به این متد ها پاس دهید.

تایپ مقدار میتواند عدد یا استرینگ و تایپ کلید باید استرینگ باشند.

تمام کلید هایی که میتوان به عنوان پارامتر دوم پاس داد در جدول زیر آمده است:

کلید ها
yearsyeary
monthsmonthM
daysdayd
hourshourh
minutesminutem
secondsseconds
millisecondsmillisecondms

برای مثال، برای اضافه کردن ۵ روز به لحظه حال میتوان به این صورت عمل کرد:

const date = new DateObject() //2021/03/02

date.add(5, "days");

console.log(date.format()); //2021/03/07

کم کردن ۱ ماه از تاریخ بالا:

date.subtract(1, "month"); 

console.log(date.format()); //2021/02/07

همچنین میتوان همه این عملیات را به صورت پیوسته نیز انجام داد:

console.log(
  new DateObject()
    .add(5, "days")
    .subtract(1, "month")
    .format()
); //2021/02/07

تولید تاریخ هجری شمسی

اگر میخواید تاریخ امروز رو به صورت شمسی تولید کنید کافیه یک آبجکت با پراپرتی calendar که برابر با persian هست رو داخل کانستراکتور DateObject قرار بدید.

const date = new DateObject({ calendar: "persian" })

console.log(date.format()) //1399/12/12

تولید تاریخ هجری قمری

const date = new DateObject({ calendar: "arabic" })

console.log(date.format()) //1442/07/18

تولید تاریخ هندی

const date = new DateObject({ calendar: "indian" })

console.log(date.format()) //1942/12/11

جدول پراپرتی هایی که بیشتر مورد استفاده قرار میگیره

پراپرتیحالتمثال
دیت آبجکتتاریخ جاوااسکریپت
yeargetFullYear()Number2021
month-Object{ length: 31, name: 'March', shortName: 'Mar', index: 2, number: 3, toString: [Function (anonymous)], valueOf: [Function (anonymous)] }
month.indexgetMonth()Number2
daygetDate()Number2
weekDay-Object{ index: 2, number: 3, toString: [Function: toString], valueOf: [Function: valueOf], name: 'Tuesday', shortName: 'Tue' }
weekDay.indexgetDay()Number2
hourgetHours()Number10
minutegetMinutes()Number53
secondgetSeconds()Number24
millisecondgetMilliseconds()Number458
valueOf()valueOf()Number1614672704244
-getTimezoneOffset()Number-210
toUTC()getUTCDate()
setYear()setFullYear()setYear(2021)
setMonth()setMonth()setMonth(10)*
setDay()setDate()setDay(7)

*متد setMonth در JavaScript ایندکس ماه را می پذیرد ، اما در DateObject باید شماره ماه را وارد کنید

همچنین در دیت آبحکت برای ست کردن مقدار زمان میتوانید به روش های زیر نیز عمل کنید:

const date = new DateObject()

date.year = 2020
date.month = 3
date.day = 4

console.log(date.format()) //2020/03/04

date.set({ year: 2010, month: 4, day: 7 })

console.log(date.format()) //2010/04/07

console.log(
  date
    .setYear(2000)
    .setMonth(1)
    .setDay(1)
    .format()
) //2000/01/01

console.log(
  date
    .set("year", 1907)
    .set("month", 7)
    .set("day", 7)
    .format()
) //1907/07/07

تولید تاریخ از روی استرینگ

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

  • اول اینکه می تونید استرینگ مورد نظرتون رو مستقیماً در کانستراکتور DateObject وارد کنید که برای این منظور باید به دو مورد زیر توجه داشته باشید:

    1. تاریخ تولید شده به این روش به تقویم میلادی و زبان انگلیسی پارس میشه.

    2. استرینگ وارد شده باید از این فرمت تبعیت کند در غیر اینصورت اشتباه تولید میشه : year month day hour minute second millisecond meridiem که شما میتونید فاصله ها رو با هر کاراکتر دیگه ای جایگرین کنید:

    var date = new DateObject("2020 8 21 11 55 36 100 am");
    
    date.format("YYYY/MM/DD hh:mm:ss.SSS a"); //2020/08/21 11:55:36.100 am
    
    date = new DateObject("2020/08/01");
    
    date.format("YYYY/MM/DD hh:mm:ss.SSS a"); //2020/08/01 12:00:00.000 am
  • اگر فرمت خاصی به غیر از فرمت گفته شده در مثال قبل مد نظرتون هست باید اون فرمت و استرینگ رو داخل یک آبجکت قرار بدید؛ برای این منظور به روش زیر عمل کنید :

    const date = new DateObject({
      date: "September 04 2021, 12:42 am",
      format: "MMMM DD YYYY, HH:mm a"
    })
    
    console.log(date.format()); //September 04 2021, 12:42 pm

    اگر استرینگ تاریخ شما باید به تقویمی غیر از میلادی یا زبانی غیر از انگلیسی پارس بشه باید اسم اون تقویم و یا اون زبان رو هم مثل این مثال داخل آبجکتتون قرار بدید:

    const date = new DateObject({
      date: "1400/05/14 18:35:44",
      format: "YYYY/MM/DD HH:mm:ss",
      calendar: "persian",
      locale: "fa"
    })
    
    console.log(
      date.format("DD MMMM سال YYYY, ساعت HH و mm دقیقه")
    ); //۱۴ مرداد سال ۱۴۰۰, ساعت ۱۸ و ۳۵ دقیقه

تولید یک دیت آبجکت از روی Date جاوا اسکریپت

const date = new DateObject(new Date(2020, 1, 15))

console.log(date.format()) //2020/01/15

تولید تاریخ شمسی توسط Date جاوا اسکریپت

const date = new DateObject({
  date: new Date(2020, 1, 15),
  calendar: "persian"
})

console.log(date.format()) //1399/10/26

تولید تاریخ شمسی توسط مقدار عددی

const date = new DateObject({
  year:1400,
  month:10,
  day:22,
  calendar:"persian"
  locale:"fa"
})

console.log(date.format("dddd DD MMMM سال YYYY")) //چهارشنبه ۲۲ دی سال ۱۴۰۰

تولید تاریخ شمسی توسط زمان یونیکس

خب اگه اینجا برید بهتون ثانیه یونیکس همون لحظه رو میده.

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

فقط توجه کنید که این مقدار به ثانیه هست و ما باید به میلی ثانیه تبدیلش کنیم پس ضرب در 1000 اش میکنیم :

const date = new DateObject({
  date: 1614678083 * 1000,
  calendar: "persian"
})

console.log(date.format()) //1399/12/12

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

const date = new DateObject(1614678083 * 1000)

فقط اینم بگم که اگر بخواید مقدار unix هر تاریخی رو بدونید باید از متد ()toUnix استفاده کنید. مثلا برای متغیر بالا اگر از متد toUnix استفاده کنیم دوباره همون عدد خودمون برامون چاپ میشه :

console.log(date.toUnix()) //1614678083

تبدیل تاریخ هجری شمسی به هجری قمری

برای تبدیل هر تاریخ به تاریخ دیگه از متد convert استفاده کنید.

const date = new DateObject({calendar:"persian", date:"1399/12/24"})
        
date.convert("arabic")

console.log(date.format()) //1442/07/30

تبدیل تاریخ هجری قمری به هجری شمسی

const date = new DateObject({ calendar: "arabic", date: "1442/05/10" })

date.convert("persian")

console.log(date.format()) //1399/10/05

تبدیل تاریخ میلادی به هندی

console.log(new DateObject().convert("indian").format()) //1942/12/11