Sana, vaqt va davomiylikni aniq boshqarish uchun zamonaviy yechim bo'lgan JavaScript Temporal API'ni o'rganing. Ushbu kuchli standart bilan kodingizni yaxshilang.
JavaScript Temporal API: Sana va Vaqt bilan Ishlashning Zamonaviy Usuli
Sana va vaqt bilan ishlash uzoq vaqtdan beri JavaScript dasturchilari uchun muammo bo'lib kelgan. O'rnatilgan Date
ob'ekti, garchi funksional bo'lsa-da, ko'pincha aniqlik, xalqarolashtirishni qo'llab-quvvatlash va umumiy foydalanish qulayligi jihatidan yetarli emas. Bu kamchiliklarni tan olgan holda, ECMAScript hamjamiyati sana va vaqt bilan ishlashning murakkabliklarini hal qilish uchun mo'ljallangan zamonaviy va keng qamrovli yechim - Temporal API'ni ishlab chiqdi.
Mavjud Date
Ob'ektining Muammolari
JavaScript'ning dastlabki kunlarida taqdim etilgan Date
ob'ekti bir nechta cheklovlarga ega. Bularga quyidagilar kiradi:
- O'zgaruvchanlik:
Date
ob'ektlari o'zgaruvchandir, ya'ni ularning qiymatlarini to'g'ridan-to'g'ri o'zgartirish mumkin. Bu kutilmagan xatti-harakatlarga va tuzatish qiyin bo'lgan kodga olib kelishi mumkin. - Nomutanosib Xatti-harakatlar: Turli xil lokallar va brauzerlardagi sana formatlarining o'zgarishi tufayli satrlardan sanalarni tahlil qilish ishonchsiz bo'lishi mumkin.
- Cheklangan Vaqt Mintaqasini Qo'llab-quvvatlash: Garchi u ba'zi vaqt mintaqasi funksiyalarini taklif qilsa-da, u ko'pincha noqulay va xatoliklarga moyil. Yozgi vaqtga o'tish (DST) hisob-kitoblari ayniqsa qiyin bo'lishi mumkin.
- O'zgarmas Muqobillarning Yo'qligi: O'zgarmas sana/vaqt turlarining yo'qligi kod haqida mulohaza yuritishni va uni saqlashni qiyinlashtiradi, chunki bitta sana ob'ektidagi o'zgarishlar beixtiyor boshqalarga ta'sir qilishi mumkin.
Bu kamchiliklar dasturchilarni ushbu cheklovlarni yengish uchun Moment.js va date-fns kabi uchinchi tomon kutubxonalariga tayanishga majbur qildi. Biroq, bu kutubxonalar loyihaga qo'shimcha yuk qo'shadi va texnik xizmat ko'rsatishni talab qiladi. Temporal API standartlashtirilgan, o'rnatilgan yechimni taqdim etadi.
Temporal API bilan tanishuv
Temporal API - bu ECMAScript (JavaScript'ni belgilaydigan standart) uchun yangi taklif bo'lib, sana va vaqt bilan ishlashga yanada mustahkam, aniq va dasturchilar uchun qulay yondashuvni ta'minlashni maqsad qilgan. U mavjud Date
ob'ektining kamchiliklarini bartaraf etish uchun mo'ljallangan boy xususiyatlar to'plamini taklif etadi.
Temporal API'ning Asosiy Xususiyatlari:
- O'zgarmaslik: Temporal ob'ektlari o'zgarmasdir. Temporal ob'ektidagi amallar har doim yangi ob'ektni qaytaradi, asl nusxani o'zgarishsiz qoldiradi. Bu kod xavfsizligi va oldindan aytib bo'lishlikni sezilarli darajada yaxshilaydi.
- Aniq va Izchil API: API mavjud
Date
ob'ektiga qaraganda intuitivroq va ishlatish uchun osonroq qilib ishlab chiqilgan. U turli xil sana va vaqt amallari uchun aniq va izchil usullarni taqdim etadi. - Xalqarolashtirishni qo'llab-quvvatlash: Temporal API o'rnatilgan xalqarolashtirishni qo'llab-quvvatlashga ega bo'lib, turli xil lokallar va vaqt mintaqalarida sanalar va vaqtlar bilan ishlashni osonlashtiradi. U keng qamrovli lokalga xos ma'lumotlarni taqdim etuvchi ICU (International Components for Unicode) kutubxonasi bilan uzviy bog'lanadi.
- Aniq hisob-kitoblar: Temporal davomiyliklar, intervallar va vaqt bilan bog'liq boshqa amallar uchun aniq hisob-kitoblarni taklif qiladi, bu esa xatolar xavfini kamaytiradi.
- Turlarning xavfsizligi: Temporal
Temporal.PlainDate
,Temporal.PlainTime
, vaTemporal.ZonedDateTime
kabi turli xil sana va vaqt komponentlari uchun alohida turlarni joriy qiladi, bu esa kodning aniqligi va turlar xavfsizligini oshiradi. - Yaxshilangan Vaqt Mintaqasini Boshqarish: Temporal vaqt mintaqasini boshqarishni, jumladan DST o'tishlari va boshqa murakkab vaqt mintaqasi qoidalarini qo'llab-quvvatlashni soddalashtiradi.
Asosiy Temporal Turlari
Temporal API turli xil sana va vaqt tushunchalarini ifodalash uchun bir nechta asosiy turlarni joriy qiladi. Ushbu turlarni tushunish API bilan samarali ishlash uchun juda muhimdir:
Temporal.PlainDate
Vaqt yoki vaqt mintaqasisiz taqvim sanasini ifodalaydi. Masalan, 2024-03-15. Bu tug'ilgan kunlar, yubileylar va vaqtdan qat'i nazar, ma'lum bir kunda sodir bo'ladigan boshqa voqealarni ifodalash uchun foydalidir.
const today = Temporal.PlainDate.from('2024-03-15');
console.log(today.year); // 2024
console.log(today.month); // 3
console.log(today.day); // 15
Temporal.PlainTime
Sana yoki vaqt mintaqasisiz kun vaqtini ifodalaydi. Masalan, 14:30:00. Bu uchrashuv vaqtlari, ish soatlari va har kuni ma'lum bir vaqtda sodir bo'ladigan boshqa voqealarni ifodalash uchun foydalidir.
const meetingTime = Temporal.PlainTime.from('14:30:00');
console.log(meetingTime.hour); // 14
console.log(meetingTime.minute); // 30
console.log(meetingTime.second); // 0
Temporal.PlainDateTime
Vaqt mintaqasisiz sana va vaqtni ifodalaydi. Masalan, 2024-03-15T14:30:00. Bu ma'lum bir sana va vaqtga ega bo'lgan, ammo vaqt mintaqasi muhim bo'lmagan voqealarni ifodalash uchun foydalidir.
const eventDateTime = Temporal.PlainDateTime.from('2024-03-15T14:30:00');
console.log(eventDateTime.year); // 2024
console.log(eventDateTime.month); // 3
console.log(eventDateTime.day); // 15
console.log(eventDateTime.hour); // 14
console.log(eventDateTime.minute); // 30
console.log(eventDateTime.second); // 0
Temporal.ZonedDateTime
Vaqt mintaqasi bilan sana va vaqtni ifodalaydi. Masalan, 2024-03-15T14:30:00+05:30[Asia/Kolkata]. Bu xalqaro reyslar yoki video konferensiyalar kabi turli vaqt mintaqalarida kuzatib borish kerak bo'lgan voqealarni ifodalash uchun muhimdir.
const indiaTime = Temporal.ZonedDateTime.from('2024-03-15T14:30:00+05:30[Asia/Kolkata]');
console.log(indiaTime.year); // 2024
console.log(indiaTime.month); // 3
console.log(indiaTime.day); // 15
console.log(indiaTime.hour); // 14
console.log(indiaTime.minute); // 30
console.log(indiaTime.second); // 0
console.log(indiaTime.timeZone.id); // Asia/Kolkata
Temporal.Duration
Vaqt oralig'ini ifodalaydi. Uni ikki sana/vaqt ob'ekti o'rtasidagi vaqt farqini yoki vaqt intervalini ifodalash uchun ishlatish mumkin.
const duration = Temporal.Duration.from({ hours: 2, minutes: 30 });
console.log(duration.hours); // 2
console.log(duration.minutes); // 30
Temporal.Instant
Biror bir vaqt mintaqasi yoki taqvimdan mustaqil ravishda vaqtning yagona nuqtasini ifodalaydi. U Unix davridan beri o'tgan nanosekundlar soniga asoslangan.
const nowInstant = Temporal.Instant.now()
console.log(nowInstant.epochNanoseconds); // Joriy vaqtni nanosekundlarda ifodalovchi katta raqam
Temporal Ob'ektlari bilan Ishlash: Amaliy Misollar
Temporal API'dan qanday foydalanishni ko'rsatish uchun ba'zi amaliy misollarni ko'rib chiqamiz:
Sana va Vaqtlarni Yaratish
Temporal ob'ektlarini yaratish oson. Siz from()
usulidan yoki to'g'ridan-to'g'ri konstruktordan foydalanishingiz mumkin:
// PlainDate yaratish
const plainDate = Temporal.PlainDate.from('2024-12-25'); // Rojdestvo kuni
// PlainTime yaratish
const plainTime = Temporal.PlainTime.from('10:00'); // Ertalab soat 10
// PlainDateTime yaratish
const plainDateTime = Temporal.PlainDateTime.from('2024-03-15T14:30');
// ZonedDateTime yaratish
const zonedDateTime = Temporal.ZonedDateTime.from('2024-03-15T14:30[America/Los_Angeles]'); // Los-Anjelesdagi misol
Sana Arifmetikasi
Temporal API sana arifmetikasini sodda va aniq qiladi. Siz sana va vaqt ob'ektlariga davomiyliklarni qo'shishingiz yoki ayirishingiz mumkin:
const startDate = Temporal.PlainDate.from('2024-03-15');
const duration = Temporal.Duration.from({days: 7});
const endDate = startDate.add(duration);
console.log(endDate.toString()); // 2024-03-22
const minusDuration = Temporal.Duration.from({days: 3});
const earlierDate = startDate.subtract(minusDuration);
console.log(earlierDate.toString()); // 2024-03-12
Vaqt Mintaqasini O'zgartirish
Temporal.ZonedDateTime
yordamida vaqt mintaqalari o'rtasida o'zgartirish oson:
const losAngelesTime = Temporal.ZonedDateTime.from('2024-03-15T10:00[America/Los_Angeles]');
const newYorkTime = losAngelesTime.withTimeZone('America/New_York');
console.log(newYorkTime.toString()); // 2024-03-15T13:00:00-04:00[America/New_York] (yozgi vaqt amalda deb faraz qilinsa)
Davomiyliklarni Hisoblash
Siz ikki sana/vaqt ob'ekti orasidagi davomiylikni hisoblashingiz mumkin:
const start = Temporal.PlainDate.from('2024-03-01');
const end = Temporal.PlainDate.from('2024-03-15');
const duration = start.until(end);
console.log(duration.toString()); // P14D
Sana va Vaqtlarni Formatlash
Temporal API lokalga mos formatlashni ta'minlash uchun xalqarolashtirish (i18n) bilan integratsiyalashgan. API o'zi eski `Date` ob'ektining toLocaleDateString()
kabi o'rnatilgan formatlash funksiyalarini o'z ichiga olmasa-da, u Intl API bilan yaqindan ishlash uchun mo'ljallangan. Dasturchilar foydalanuvchining lokaliga asoslanib, temporal ob'ektlarni satrlarga formatlash uchun Intl API'dan foydalanishlari mumkin.
const plainDate = Temporal.PlainDate.from('2024-03-15');
const formatter = new Intl.DateTimeFormat('en-US', { dateStyle: 'full' });
console.log(formatter.format(plainDate.toJSDate())); // Friday, March 15, 2024
const deFormatter = new Intl.DateTimeFormat('de-DE', { dateStyle: 'full' });
console.log(deFormatter.format(plainDate.toJSDate())); // Freitag, 15. März 2024
Temporal API'dan Foydalanishning Afzalliklari
Mavjud Date
ob'ekti va uchinchi tomon kutubxonalariga nisbatan Temporal API bir nechta afzalliklarni taklif etadi:
- Standartlashtirilgan: ECMAScript standartining bir qismi bo'lganligi sababli, Temporal API tashqi bog'liqliklarga bo'lgan ehtiyojni yo'qotadi va turli JavaScript muhitlarida izchillikni ta'minlaydi.
- O'zgarmaslik: O'zgarmaslik kutilmagan o'zgarishlarning oldini oladi va kod haqida mulohaza yuritishni va tuzatishni osonlashtiradi.
- Yaxshilangan Aniqlik: Temporal API aniq hisob-kitoblarni ta'minlaydi va vaqt mintaqasi murakkabliklarini yanada samaraliroq hal qiladi.
- Xalqarolashtirish: O'rnatilgan xalqarolashtirishni qo'llab-quvvatlash turli xil lokallar va vaqt mintaqalarida sanalar va vaqtlar bilan ishlashni osonlashtiradi.
- Turlarning Xavfsizligi va Aniqliği: Turli xil sana va vaqt komponentlari uchun alohida turlar kodning o'qilishini yaxshilaydi va xatolarni kamaytiradi.
Brauzer va Muhitni Qo'llab-quvvatlash
Temporal API hali ham nisbatan yangi va uni qo'llab-quvvatlash turli brauzerlar va JavaScript ish vaqti muhitlarida farq qiladi. Ushbu maqolani yozish vaqtida, Temporal hali barcha brauzerlarda to'liq qo'llab-quvvatlanmaydi. Biroq, so'nggi relizlarda u tobora ko'proq qo'llab-quvvatlanmoqda.
Hozirgi holat bo'yicha qo'llab-quvvatlashning umumiy ko'rinishi:
- Zamonaviy Brauzerlar: Asosiy brauzerlarning (Chrome, Firefox, Safari, Edge) so'nggi versiyalari qo'llab-quvvatlashni tobora oshirmoqda. Eng so'nggi ma'lumotlar uchun brauzer mosligi jadvallarini (caniuse.com kabi) tekshiring.
- Node.js: Node.js qo'llab-quvvatlashni asta-sekin qo'shib kelmoqda. Node.js'ning so'nggi versiyalari o'rnatilgan Temporal qo'llab-quvvatlashini o'z ichiga oladi.
- Transpilyatsiya: Agar siz eski muhitlarni qo'llab-quvvatlashingiz kerak bo'lsa, Temporal kodini eski brauzerlarda ishlaydigan kodga aylantirish uchun Babel kabi transpilyatordan foydalanishingiz mumkin. Shuningdek, polifill ishlatishingiz mumkin.
Muhim Eslatma: Ishlab chiqarishda Temporal API'dan foydalanishdan oldin har doim brauzer mosligini tekshirish va maqsadli muhitlar uni qo'llab-quvvatlashiga ishonch hosil qilish juda muhimdir. Barcha maqsadli brauzerlaringizda moslikni ta'minlash uchun xususiyatlarni aniqlash yoki polifill ishlatishni ko'rib chiqing.
Qabul qilish va Eng Yaxshi Amaliyotlar
Temporal API'ni qabul qilish sana va vaqt bilan ishlashga bo'lgan yondashuvingizni o'zgartirishni talab qiladi. Mana bir nechta eng yaxshi amaliyotlar:
- Bosqichma-bosqich Qabul qilish: Yangi loyihalarda Temporal'dan foydalanishni boshlang yoki mavjud loyihalarga asta-sekin kiriting.
- Turlar bilan Tanishing: O'zingizning ehtiyojlaringiz uchun mosini tanlash uchun turli Temporal turlarini (
PlainDate
,PlainTime
,ZonedDateTime
, va hokazo) tushuning. - O'zgarmaslikdan Foydalaning: Xavfsizroq va oldindan aytib bo'ladigan kod yozish uchun Temporal ob'ektlarining o'zgarmasligini qabul qiling.
- Xalqarolashtirishdan Foydalaning: Foydalanuvchi lokallariga muvofiq sanalar va vaqtlarni formatlash uchun Intl API'dan (Temporal bilan birga) foydalaning. Sana/vaqt formatlarining global oqibatlarini hisobga oling. Masalan, sanalar AQShda (OY/KK/YYYY) Buyuk Britaniyaga (KK/OY/YYYY) nisbatan boshqacha formatlanishi mumkin.
- Puxta Sinovdan O'tkazing: Sana va vaqt mantig'ingizni, ayniqsa vaqt mintaqalari va yozgi vaqt bilan ishlaganda, keng qamrovli sinovdan o'tkazing.
- Yangiliklardan Xabardor Bo'ling: Temporal API hali ham rivojlanmoqda. Yangilanishlar va yangi xususiyatlarni kuzatib boring.
Haqiqiy Hayotdagi Qo'llash Holatlari
Temporal API keng doiradagi ilovalarda, jumladan, quyidagilarda qimmatlidir:
- Rejalashtirish va Tadbirlarni Boshqarish: Turli vaqt mintaqalarida uchrashuvlar, yig'ilishlar va tadbirlarni boshqarish (masalan, London va Tokio o'rtasida konferens-aloqa rejalashtirish).
- Moliyaviy Ilovalar: Foizlarni, to'lov muddatlarini va vaqtga bog'liq boshqa moliyaviy hisob-kitoblarni hisoblash.
- Elektron Tijorat: Buyurtma sanalari, yetkazib berish vaqtlari va jo'natish muddatlarini boshqarish (masalan, xaridorning joylashuvi va sotuvchining ish soatlariga qarab kutilayotgan yetkazib berish vaqtini ko'rsatish).
- Sayohat va Mehmondo'stlik: Parvoz jadvallari, mehmonxona bronlari va ro'yxatdan o'tish/chiqish vaqtlarini boshqarish.
- Ma'lumotlarni Tahlil qilish va Hisobot Berish: Vaqt qatori ma'lumotlarini tahlil qilish va aniq vaqtga asoslangan tushunchalar bilan hisobotlar yaratish.
- O'yinlar: Kutish vaqti yoki kunlik mukofotlar kabi vaqtga bog'liq o'yin mexanikalarini amalga oshirish.
Xulosa
JavaScript Temporal API sana va vaqt bilan ishlashda muhim yutuqni ifodalaydi. U JavaScript'da sanalar va vaqtlar bilan ishlashdagi qiyinchiliklarga zamonaviy, mustahkam va dasturchilar uchun qulay yechimni taqdim etadi. Temporal API'ni qabul qilish orqali dasturchilar yanada aniqroq, saqlanishi oson va xalqaro miqyosda xabardor kod yozishlari mumkin. Garchi to'liq qabul qilish hali davom etayotgan bo'lsa-da, Temporal API'dan foydalanishning afzalliklari shubhasizdir. Brauzerlarni qo'llab-quvvatlash yaxshilanishda davom etar ekan, Temporal API butun dunyo bo'ylab JavaScript dasturchilari uchun ajralmas vositaga aylanadi.
Qo'shimcha Manbalar:
Temporal API'ni bugundan o'rganishni boshlang va uning JavaScript loyihalaringizga qanday o'zgarish kiritishini his eting.