توضیحات
دیت آبجکت در حقیقت یک کلاس 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 2const {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 استفاده کرد.
به اینصورت که باید دو پارامتر مقدار و کلید را به این متد ها پاس دهید.
تایپ مقدار میتواند عدد یا استرینگ و تایپ کلید باید استرینگ باشند.
تمام کلید هایی که میتوان به عنوان پارامتر دوم پاس داد در جدول زیر آمده است:
| کلید ها | ||
|---|---|---|
| years | year | y |
| months | month | M |
| days | day | d |
| hours | hour | h |
| minutes | minute | m |
| seconds | second | s |
| milliseconds | millisecond | ms |
برای مثال، برای اضافه کردن ۵ روز به لحظه حال میتوان به این صورت عمل کرد:
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جدول پراپرتی هایی که بیشتر مورد استفاده قرار میگیره
| پراپرتی | حالت | مثال | |
|---|---|---|---|
| دیت آبجکت | تاریخ جاوااسکریپت | ||
| year | getFullYear() | Number | 2021 |
| month | - | Object | { length: 31, name: 'March', shortName: 'Mar', index: 2, number: 3, toString: [Function (anonymous)], valueOf: [Function (anonymous)] } |
| month.index | getMonth() | Number | 2 |
| day | getDate() | Number | 2 |
| weekDay | - | Object | { index: 2, number: 3, toString: [Function: toString], valueOf: [Function: valueOf], name: 'Tuesday', shortName: 'Tue' } |
| weekDay.index | getDay() | Number | 2 |
| hour | getHours() | Number | 10 |
| minute | getMinutes() | Number | 53 |
| second | getSeconds() | Number | 24 |
| millisecond | getMilliseconds() | Number | 458 |
| valueOf() | valueOf() | Number | 1614672704244 |
| - | 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 وارد کنید که برای این منظور باید به دو مورد زیر توجه داشته باشید:
تاریخ تولید شده به این روش به تقویم میلادی و زبان انگلیسی پارس میشه.
استرینگ وارد شده باید از این فرمت تبعیت کند در غیر اینصورت اشتباه تولید میشه : 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