تقریباً کسی بھی قسم کی ایپلیکیشن جاوا اسکرپٹ میں لکھی گئی ہے کچھ صلاحیت میں اوقات یا تاریخوں کے ساتھ کام کرتی ہے۔ شروع میں، یہ بلٹ ان ڈیٹ API تک محدود تھا۔ اس API میں بنیادی فعالیت شامل ہے، لیکن یہ جو کچھ کر سکتا ہے اس میں کافی حد تک محدود ہے۔ فریق ثالث کی لائبریریاں جیسے Moment.js، اور بعد میں بلٹ ان APIs جیسے Intl APIs اور نئے Temporal API، اوقات اور تاریخوں کے ساتھ کام کرنے میں بہت زیادہ لچک پیدا کرتی ہیں۔ The Rise and Fall of Moment.js Moment.js ایک جاوا اسکرپٹ لائبریری ہے جس میں وقت اور تاریخوں کے ساتھ کام کرنے کے لیے طاقتور یوٹیلیٹیز ہیں۔ اس میں بنیادی تاریخ API سے غائب خصوصیات شامل ہیں، جیسے ٹائم زون میں ہیرا پھیری، اور بہت سے عام کاموں کو آسان بناتی ہے۔ لمحے میں تاریخوں اور اوقات کی فارمیٹنگ کے فنکشن بھی شامل ہیں۔ یہ بہت سے مختلف ایپلی کیشنز میں وسیع پیمانے پر استعمال ہونے والی لائبریری بن گئی۔ تاہم، لمحے کے مسائل میں بھی اس کا حصہ تھا۔ یہ ایک بڑی لائبریری ہے، اور ایپلیکیشن کے بنڈل سائز میں نمایاں اضافہ کر سکتی ہے۔ چونکہ لائبریری درخت ہلانے کی حمایت نہیں کرتی ہے (جدید بنڈلرز کی ایک خصوصیت جو لائبریریوں کے غیر استعمال شدہ حصوں کو ہٹا سکتی ہے)، پوری مومنٹ لائبریری کو شامل کیا جاتا ہے چاہے آپ اس کے صرف ایک یا دو افعال استعمال کریں۔ لمحے کے ساتھ ایک اور مسئلہ یہ ہے کہ اس کی تخلیق کردہ اشیاء متغیر ہیں۔ کسی مومنٹ آبجیکٹ پر کچھ فنکشنز کو کال کرنے کے ضمنی اثرات ہوتے ہیں اور اس چیز کی قدر کو بدل دیتے ہیں۔ یہ غیر متوقع سلوک یا کیڑے کا باعث بن سکتا ہے۔ 2020 میں، مومنٹ کے مینٹینرز نے لائبریری کو مینٹیننس موڈ میں ڈالنے کا فیصلہ کیا۔ کوئی نئی خصوصیت تیار نہیں کی جا رہی ہے، اور دیکھ بھال کرنے والے اسے نئے منصوبوں کے لیے استعمال کرنے کے خلاف تجویز کرتے ہیں۔ دیگر JavaScript کی تاریخ کی لائبریریاں ہیں، جیسے date-fns، لیکن شہر میں ایک نیا پلیئر ہے، ایک API جو براہ راست JavaScript میں بنایا گیا ہے: Temporal۔ یہ ایک نیا معیار ہے جو اصل Date API کے سوراخوں کو بھرتا ہے اور ساتھ ہی Moment اور دیگر لائبریریوں میں پائی جانے والی کچھ حدود کو حل کرتا ہے۔ دنیاوی کیا ہے؟ Temporal ایک نیا وقت اور تاریخ API ہے جسے ECMAScript معیار میں شامل کیا جا رہا ہے، جو جدید JavaScript کی وضاحت کرتا ہے۔ مارچ 20266 تک، یہ TC39 عمل کے مرحلے 4 تک پہنچ گیا ہے (وہ کمیٹی جو جاوا اسکرپٹ زبان میں تجاویز اور اضافے کی نگرانی کرتی ہے)، اور اسے ECMAScript تفصیلات کے اگلے ورژن میں شامل کیا جائے گا۔ اسے پہلے ہی کئی براؤزرز میں لاگو کیا جا چکا ہے: Chrome 144+ اور Firefox 139+، سفاری کے ساتھ جلد ہی اس کی پیروی کی توقع ہے۔ ایک پولی فل غیر تعاون یافتہ براؤزرز اور Node.js کے لیے بھی دستیاب ہے۔ Temporal API ایسی اشیاء تخلیق کرتا ہے جو عام طور پر وقت کے لمحات کی نمائندگی کرتی ہے۔ یہ کسی مخصوص ٹائم زون میں کل وقتی اور تاریخ کے ڈاک ٹکٹ ہو سکتے ہیں، یا یہ بغیر کسی ٹائم زون یا تاریخ کی معلومات کے "وال کلاک" کے وقت کی عمومی مثال ہو سکتی ہیں۔ Temporal کی کچھ اہم خصوصیات میں شامل ہیں:

تاریخوں کے ساتھ یا اس کے بغیر اوقات۔ ایک وقتی چیز کسی مخصوص تاریخ پر ایک مخصوص وقت کی نمائندگی کر سکتی ہے، یا تاریخ کی معلومات کے بغیر وقت۔ ایک مخصوص تاریخ، بغیر وقت کے، بھی نمائندگی کی جا سکتی ہے۔ ٹائم زون سپورٹ۔ وقتی اشیاء مکمل طور پر ٹائم زون سے آگاہ ہیں اور مختلف ٹائم زونز میں تبدیل کی جا سکتی ہیں۔ لمحہ ٹائم زون کو بھی سپورٹ کرتا ہے، لیکن اس کے لیے اضافی لمحہ ٹائم زون لائبریری کی ضرورت ہوتی ہے۔ تغیر پذیری۔ ایک بار ایک وقتی چیز بن جاتی ہے، اسے تبدیل نہیں کیا جا سکتا۔ ٹائم ریاضی یا ٹائم زون کی تبدیلیاں بنیادی چیز کو تبدیل نہیں کرتی ہیں۔ اس کے بجائے، وہ ایک نیا عارضی آبجیکٹ تیار کرتے ہیں۔ 1 پر مبنی انڈیکسنگ۔ ڈیٹ API کے ساتھ کیڑے کا ایک عام ذریعہ (اور ساتھ ساتھ مومنٹ کے ساتھ) یہ ہے کہ مہینوں کو صفر انڈیکس کیا جاتا ہے۔ اس کا مطلب ہے کہ جنوری 0 کا مہینہ ہے، بجائے اس کے کہ 1 مہینہ ہو جیسا کہ ہم سب حقیقی زندگی میں سمجھتے ہیں۔ وقتی اسے 1 پر مبنی اشاریہ سازی کا استعمال کرکے ٹھیک کرتا ہے — جنوری 1 مہینہ ہے۔ یہ براؤزر میں بنایا گیا ہے۔ چونکہ Temporal براؤزر میں ہی ایک API ہے، اس لیے یہ آپ کی ایپلیکیشن کے بنڈل سائز میں کچھ بھی شامل نہیں کرتا ہے۔

یہ نوٹ کرنا بھی ضروری ہے کہ Date API ختم نہیں ہو رہا ہے۔ جبکہ Temporal اس API کی جگہ لے لیتا ہے، اسے ہٹایا یا فرسودہ نہیں کیا جا رہا ہے۔ اگر براؤزرز نے اچانک Date API کو ہٹا دیا تو بہت سی ایپلیکیشنز ٹوٹ جائیں گی۔ تاہم، یہ بھی ذہن میں رکھیں کہ مومنٹ اب مینٹیننس موڈ میں ایک میراثی پروجیکٹ سمجھا جاتا ہے۔ باقی مضمون میں، ہم لمحہ پر مبنی کوڈ کو نئے Temporal API میں منتقل کرنے کے لیے کچھ "ترکیبات" دیکھیں گے۔ آئیے ری فیکٹرنگ شروع کریں! تاریخ اور وقت آبجیکٹ بنانا اس سے پہلے کہ ہم تاریخوں اور اوقات میں ہیرا پھیری کر سکیں، ہمیں ان کی نمائندگی کرنے والی اشیاء بنانا ہوں گی۔ موجودہ تاریخ اور وقت کی نمائندگی کرنے والی ایک مومنٹ آبجیکٹ بنانے کے لیے، مومنٹ فنکشن کا استعمال کریں۔ const now = لمحہ()؛ console.log(اب)؛ // لمحہ<2026-02-18T21:26:29-05:00>

اس آبجیکٹ کو اب فارمیٹ کیا جا سکتا ہے یا ضرورت کے مطابق ہیرا پھیری کی جا سکتی ہے۔

// UTC میں تبدیل کریں۔ //انتباہ: یہ مومنٹ آبجیکٹ کو تبدیل کرتا ہے اور اسے UTC موڈ میں رکھتا ہے! console.log(now.utc())؛ // لمحہ<2026-02-19T02:26:29Z>

// فارمیٹ شدہ سٹرنگ پرنٹ کریں - نوٹ کریں کہ یہ UTC وقت استعمال کر رہا ہے۔ console.log(now.format('MM/DD/YYYY hh:mm:ss a')); // 02/19/2026 02:27:07 am

لمحے کے بارے میں یاد رکھنے کی اہم بات یہ ہے کہ ایک لمحہ آبجیکٹ میں ہمیشہ وقت اور تاریخ کے بارے میں معلومات شامل ہوتی ہیں۔ اگر آپ کو صرف وقت کی معلومات کے ساتھ کام کرنے کی ضرورت ہے، تو یہ عام طور پر ٹھیک ہے، لیکن یہ ڈے لائٹ سیونگ ٹائم یا لیپ سال جیسے حالات میں غیر متوقع رویے کا سبب بن سکتا ہے، جہاں تاریخ وقت کے حساب پر اثر ڈال سکتی ہے۔ دنیاوی زیادہ لچکدار ہے۔ آپ ایک Temporal.Instant آبجیکٹ بنا کر موجودہ تاریخ اور وقت کی نمائندگی کرنے والی چیز بنا سکتے ہیں۔ یہ وقت کے ایک نقطہ کی نمائندگی کرتا ہے جس کی وضاحت اس وقت کے بعد کی گئی ہے جو کہ "دور" (1 جنوری 1970 کو آدھی رات UTC) سے ہے۔ Temporal اس فوری طور پر نینو سیکنڈ لیول کی درستگی کے ساتھ حوالہ دے سکتا ہے۔ const now = Temporal.Now.instant();

// عہد کے بعد سے خام نینو سیکنڈز دیکھیں console.log(now.epochNanoseconds)؛ // 1771466342612000000n

// UTC کے لیے فارمیٹ console.log(now.toString())؛ // 2026-02-19T01:55:27.844Z

// کسی مخصوص ٹائم زون کے لیے فارمیٹ console.log(now.toString({timeZone:'America/New_York' })); // 2026-02-18T20:56:57.905-05:00

منجمد طریقہ استعمال کر کے ایک مخصوص وقت اور تاریخ کے لیے عارضی اشیاء بھی بنائی جا سکتی ہیں۔

const myInstant = Temporal.Instant.from('2026-02-18T21:10:00-05:00')؛

// مقامی ٹائم زون میں فوری فارمیٹ کریں۔ نوٹ کریں کہ یہ صرف کنٹرول کرتا ہے۔ // فارمیٹنگ - یہ چیز کو تبدیل نہیں کرتا ہے جیسے moment.utc کرتا ہے۔ console.log(myInstant.toString({ timeZone: 'America/New_York' }))؛ // 2026-02-18T21:10:00-05:00

آپ دیگر اقسام کی دنیاوی اشیاء بھی بنا سکتے ہیں، بشمول:

Temporal.PlainDate: ایک تاریخ جس میں وقت کی معلومات نہیں ہے۔ Temporal.PlainTime: ایسا وقت جس میں تاریخ کی کوئی معلومات نہیں۔ Temporal.ZonedDateTime: ایک مخصوص ٹائم زون میں تاریخ اور وقت۔

ان میں سے ہر ایک کا ایک طریقہ ہے جسے تاریخ اور/یا وقت بتانے والے کسی شے کے ساتھ بلایا جا سکتا ہے، یا تجزیہ کرنے کے لیے تاریخ کی تار۔ // صرف ایک تاریخ const today = Temporal.PlainDate.from({ سال: 2026 مہینہ: 2، // نوٹ کریں کہ ہم فروری کے لیے 2 استعمال کر رہے ہیں۔ دن: 18 }); console.log(today.toString())؛ // 2026-02-18

// صرف ایک وقت const lunchTime = Temporal.PlainTime.from({ گھنٹہ: 12 }); console.log(lunchTime.toString())؛ // 12:00:00

// یو ایس ایسٹرن ٹائم زون میں تاریخ اور وقت const dueAt = Temporal.ZonedDateTime.from({ ٹائم زون: 'امریکہ/نیو_یارک'، سال: 2026 مہینہ: 3، دن: 1، گھنٹہ: 12، منٹ: 0، دوسرا: 0 }); console.log(dueAt.toString())؛ // 2026-03-01T12:00:00-05:00[America/New_York]

تجزیہ کرنا ہم نے تاریخ اور وقت کی معلومات کے پروگراماتی تخلیق کا احاطہ کیا ہے۔ اب تجزیہ کرتے ہیں. پارسنگ ایک ایسا شعبہ ہے جہاں Moment بلٹ ان Temporal API سے زیادہ لچکدار ہے۔ آپ تاریخ کے اسٹرنگ کو لمحہ فنکشن میں پاس کر کے پارس کر سکتے ہیں۔ ایک دلیل کے ساتھ، Moment ایک ISO ڈیٹ سٹرنگ کی توقع کرتا ہے، لیکن اگر آپ استعمال کیے جانے والے تاریخ کی شکل کی وضاحت کرنے والی دوسری دلیل فراہم کرتے ہیں تو آپ متبادل فارمیٹس استعمال کر سکتے ہیں۔

const isoDate = moment('2026-02-21T09:00:00')؛ const formattedDate = moment('2/21/26 9:00:00', 'M/D/YY h:mm:ss');

console.log(isoDate)؛ // لمحہ<2026-02-21T09:00:00-05:00>

console.log(formattedDate)؛ // لمحہ<2026-02-21T09:00:00-05:00>

پرانے ورژنز میں، Moment کسی بھی من مانے فارمیٹ شدہ تاریخ کے تار کو پارس کرنے کا بہترین اندازہ لگائے گا۔ یہ غیر متوقع نتائج کی قیادت کر سکتا ہے. مثال کے طور پر، کیا 02-03-2026 فروری 2 ہے یا 3 مارچ؟ اس وجہ سے، Moment کے نئے ورژن ایک نمایاں فرسودگی کا انتباہ دکھاتے ہیں اگر اسے ISO فارمیٹ شدہ تاریخ کے اسٹرنگ کے بغیر کہا جاتا ہے (جب تک کہ مطلوبہ فارمیٹ کے ساتھ دوسری دلیل بھی نہ دی جائے)۔ Temporal صرف خاص طور پر فارمیٹ شدہ تاریخ کے اسٹرنگ کو پارس کرے گا۔ اسٹرنگ کا ISO 8601 فارمیٹ یا اس کی ایکسٹینشن، RFC 9557 کے مطابق ہونا ضروری ہے۔ اگر غیر موافق ڈیٹ سٹرنگ کو ایک سے طریقہ میں منتقل کیا جاتا ہے، تو Temporal ایک RangeError ڈالے گا۔

// RFC 9557 ڈیٹ سٹرنگ استعمال کرنا const myDate = Temporal.Instant.from('2026-02-21T09:00:00-05:00[America/New_York]')؛ console.log(myDate.toString({ timeZone: 'America/New_York' })); // 2026-02-21T09:00:00-05:00

// نامعلوم تاریخ کے تار کا استعمال کرنا const otherDate = Temporal.Instant.from('2/21/26 9:00:00')؛ // RangeError: عارضی غلطی: سال کی قدر کو پارس کرتے وقت غلط کریکٹر۔

تاریخ کے تار کی درست ضروریات کا انحصار اس بات پر ہے کہ آپ کس قسم کی عارضی آبجیکٹ بنا رہے ہیں۔ مندرجہ بالا مثال میں، Temporal.Instant کو ایک مکمل ISO درکار ہے۔8601 یا RFC 9557 ڈیٹ سٹرنگ ٹائم زون آفسیٹ کے ساتھ تاریخ اور وقت کی وضاحت کرتی ہے، لیکن آپ صرف تاریخ کی شکل کے سب سیٹ کا استعمال کرتے ہوئے PlainDate یا PlainTime اشیاء بھی بنا سکتے ہیں۔ const myDate = Temporal.PlainDate.from('2026-02-21')؛ console.log(myDate.toString())؛ // 2026-02-21

const myTime = Temporal.PlainTime.from('09:00:00')؛ console.log(myTime.toString())؛ // 09:00:00

نوٹ کریں کہ ان سٹرنگز کو ابھی بھی متوقع فارمیٹ کی تعمیل کرنی چاہیے، ورنہ ایک خرابی پھینک دی جائے گی۔

// ایک غیر تعمیل وقت کے تار کا استعمال کرتے ہوئے. یہ سب ایک RangeError پھینک دیں گے۔ Temporal.PlainTime.from('9:00'); Temporal.PlainTime.from('9:00:00 AM')؛

پرو ٹِپ: نان آئی ایس او سٹرنگز کو ہینڈل کرنا کیونکہ Temporal قابل اعتبار کو ترجیح دیتا ہے، یہ 02-01-2026 جیسے سٹرنگ کی شکل کا اندازہ لگانے کی کوشش نہیں کرے گا۔ اگر آپ کا ڈیٹا سورس اس طرح کے سٹرنگز کا استعمال کرتا ہے، تو آپ کو Temporal کے ساتھ استعمال کرنے کی کوشش کرنے سے پہلے 2026-02-01 جیسے ISO سٹرنگ میں اقدار کو دوبارہ ترتیب دینے کے لیے کچھ سٹرنگ ہیرپھیر کرنے کی ضرورت ہوگی۔

فارمیٹنگ ایک بار جب آپ کے پاس ایک لمحہ یا عارضی چیز ہے، تو آپ شاید کسی وقت اسے فارمیٹ شدہ سٹرنگ میں تبدیل کرنا چاہیں گے۔ یہ ایک ایسی مثال ہے جہاں لمحہ قدرے زیادہ واضح ہے۔ آپ آبجیکٹ کے فارمیٹ کے طریقے کو ٹوکن کی ایک تار کے ساتھ کال کرتے ہیں جو مطلوبہ تاریخ کی شکل کو بیان کرتا ہے۔ const date = لمحہ()؛

console.log(date.format('MM/DD/YYYY'))؛ // 02/22/2026

console.log(date.format('MMMM Do YYYY, h:mm:ss a')); // 22 فروری 2026، شام 8:18:30 بجے

دوسری طرف، Temporal کا تقاضا ہے کہ آپ تھوڑا زیادہ لفظی ہوں۔ عارضی آبجیکٹ، جیسے Instant، میں toLocaleString طریقہ ہوتا ہے جو کسی چیز کی خصوصیات کے طور پر مخصوص فارمیٹنگ کے مختلف اختیارات کو قبول کرتا ہے۔

const date = Temporal.Now.instant();

// بغیر کسی دلیل کے، ہمیں موجودہ لوکیل کے لیے ڈیفالٹ فارمیٹ ملے گا۔ console.log(date.toLocaleString())؛ // 2/22/2026، 8:23:36 PM (مقامی en-US فرض کرتے ہوئے)

// اپنی مرضی کے مطابق فارمیٹ سٹرنگ بنانے کے لیے فارمیٹنگ کے اختیارات پاس کریں۔ console.log(date.toLocaleString('en-US', { مہینہ: 'لمبا'، دن: 'عددی'، سال: 'عددی'، گھنٹہ: '2 ہندسوں'، منٹ: '2 عدد' })) // 22 فروری 2026 شام 8:23 بجے

// صرف وہ فیلڈز پاس کریں جو آپ فارمیٹ سٹرنگ میں چاہتے ہیں۔ console.log(date.toLocaleString('en-US', { مہینہ: 'مختصر'، دن: 'عددی' })) // 22 فروری

وقتی تاریخ کی فارمیٹنگ دراصل Intl.DateTimeFormat API (جو جدید براؤزرز میں پہلے سے ہی آسانی سے دستیاب ہے) کو ہڈ کے نیچے استعمال کرتی ہے۔ اس کا مطلب ہے کہ آپ اپنی مرضی کے مطابق فارمیٹنگ کے اختیارات کے ساتھ دوبارہ قابل استعمال DateTimeFormat آبجیکٹ بنا سکتے ہیں، پھر Temporal آبجیکٹ کو اس کے فارمیٹ کے طریقہ پر منتقل کر سکتے ہیں۔ اس کی وجہ سے، یہ اپنی مرضی کے مطابق تاریخ کے فارمیٹس کو سپورٹ نہیں کرتا ہے جیسے Moment کرتا ہے۔ اگر آپ کو 'Q1 2026' یا دیگر مخصوص فارمیٹنگ جیسی کوئی چیز درکار ہے، تو آپ کو کچھ حسب ضرورت تاریخ فارمیٹنگ کوڈ کی ضرورت ہو سکتی ہے یا کسی فریق ثالث لائبریری تک پہنچ سکتے ہیں۔ const formatter = new Intl.DateTimeFormat('en-US', { مہینہ: '2 ہندسوں'، دن: '2 ہندسوں'، سال: 'عددی' });

const date = Temporal.Now.instant(); console.log(formatter.format(date))؛ // 02/22/2026

لمحے کے فارمیٹنگ ٹوکنز لکھنے میں آسان ہیں، لیکن وہ لوکل کے موافق نہیں ہیں۔ فارمیٹ سٹرنگ "ہارڈ کوڈ" چیزیں جیسے مہینہ/دن کا آرڈر۔ کنفیگریشن آبجیکٹ کو استعمال کرنے کا فائدہ، جیسا کہ Temporal کرتا ہے، یہ ہے کہ یہ خود بخود کسی بھی دی گئی لوکل کے مطابق ڈھال لے گا اور صحیح فارمیٹ استعمال کرے گا۔ const date = Temporal.Now.instant();

const formatOptions = { مہینہ: 'عددی'، دن: 'عددی'، سال: 'عددی' };

console.log(date.toLocaleString('en-US', formatOptions))؛ // 2/22/2026

console.log(date.toLocaleString('en-GB', formatOptions))؛ // 22/02/2026

تاریخ کا حساب بہت سی ایپلی کیشنز میں، آپ کو تاریخ پر کچھ حسابات انجام دینے کی ضرورت ہوگی۔ آپ وقت کی اکائیوں (دن، گھنٹے، سیکنڈ وغیرہ) کو شامل یا گھٹانا چاہتے ہیں۔ مثال کے طور پر، اگر آپ کی موجودہ تاریخ ہے، تو آپ صارف کو اب سے 1 ہفتہ کی تاریخ دکھا سکتے ہیں۔ مومنٹ آبجیکٹ میں شامل اور گھٹانے جیسے طریقے ہوتے ہیں جو ان کارروائیوں کو انجام دیتے ہیں۔ یہ افعال ایک قدر اور اکائی لیتے ہیں، مثال کے طور پر: add(7, 'days')۔ Moment اور Temporal کے درمیان ایک بہت اہم فرق، تاہم، یہ ہے کہ تاریخ کے ان حسابات کو انجام دیتے وقت، بنیادی چیز میں ترمیم کی جاتی ہے اور اس کی اصل قدر کھو جاتی ہے۔ const now = لمحہ()؛

console.log(اب)؛ // لمحہ<2026-02-24T20:08:36-05:00>

const nextWeek = now.add(7, 'days'); console.log(اگلا ہفتہ)؛ // لمحہ<2026-03-03T20:08:36-05:00>

// Gotcha - اصل چیز کو تبدیل کیا گیا تھا۔ console.log(اب)؛ // لمحہ<2026-03-03T20:08:36-05:00>

اصل تاریخ کو کھونے سے بچنے کے لیے، آپ ایک کاپی بنانے کے لیے مومنٹ آبجیکٹ پر کلون کو کال کر سکتے ہیں۔ اب const= لمحہ()؛ const nextWeek = now.clone().add(7, 'days');

console.log(اب)؛ // لمحہ<2026-02-24T20:12:55-05:00>

console.log(اگلا ہفتہ)؛ // لمحہ<2026-03-03T20:12:55-05:00>

دوسری طرف، عارضی اشیاء ناقابل تغیر ہیں۔ ایک بار جب آپ نے ایک فوری، سادہ تاریخ، اور اسی طرح کی چیز بنا لی ہے، تو اس چیز کی قدر کبھی نہیں بدلے گی. عارضی اشیاء میں بھی شامل اور گھٹانے کے طریقے ہوتے ہیں۔ وقتی اکائیوں کو کس آبجیکٹ کی اقسام میں شامل کیا جا سکتا ہے اس کے بارے میں عارضی ہے۔ مثال کے طور پر، آپ فوری میں دنوں کا اضافہ نہیں کر سکتے ہیں:

const now = Temporal.Now.instant(); const nextWeek = now.add({ دن: 7})؛ // RangeError: وقتی غلطی: سب سے بڑی اکائی تاریخ کی اکائی نہیں ہو سکتی

اس کی وجہ یہ ہے کہ فوری اشیاء UTC میں وقت کے ایک مخصوص نقطہ کی نمائندگی کرتی ہیں اور وہ کیلنڈر-ایگنوسٹک ہیں۔ چونکہ ایک دن کی طوالت ٹائم زون کے اصولوں کی بنیاد پر تبدیل ہو سکتی ہے جیسے کہ دن کی روشنی کی بچت کا وقت، یہ حساب کتاب فوری طور پر دستیاب نہیں ہے۔ تاہم، آپ یہ آپریشن دوسری قسم کی اشیاء پر انجام دے سکتے ہیں، جیسے کہ PlainDateTime: const now = Temporal.Now.plainDateTimeISO(); console.log(now.toLocaleString())؛ // 2/24/2026، 8:23:59 PM

const nextWeek = now.add({ دن: 7})؛

// نوٹ کریں کہ اصل PlainDateTime میں کوئی تبدیلی نہیں ہے۔ console.log(now.toLocaleString())؛ // 2/24/2026، 8:23:59 PM

console.log(nextWeek.toLocaleString()); // 3/3/2026، 8:23:59 PM

آپ یہ بھی حساب لگا سکتے ہیں کہ دو لمحوں یا عارضی اشیاء کے درمیان کتنا وقت ہے۔ Moment's diff فنکشن کے ساتھ، آپ کو گرانولریٹی کے لیے ایک یونٹ فراہم کرنے کی ضرورت ہے، بصورت دیگر یہ ملی سیکنڈ میں فرق واپس کر دے گا۔ const date1 = moment('2026-02-21T09:00:00')؛ const date2 = moment('2026-02-22T10:30:00')؛

console.log(date2.diff(date1))؛ // 91800000

console.log(date2.diff(date1, 'days')); // 1

کسی عارضی آبجیکٹ کے ساتھ ایسا کرنے کے لیے، آپ کسی اور Temporal آبجیکٹ کو اس تک یا اس کے بعد کے طریقوں سے پاس کر سکتے ہیں۔ یہ ایک Temporal.Duration آبجیکٹ واپس کرتا ہے جس میں وقت کے فرق کے بارے میں معلومات ہوتی ہیں۔ دورانیہ آبجیکٹ میں فرق کے ہر جزو کے لیے خصوصیات ہیں، اور وقت کے فرق کی نمائندگی کرنے والی ISO 8601 دورانیے کی تار بھی تیار کر سکتی ہے۔

const date1 = Temporal.PlainDateTime.from('2026-02-21T09:00:00')؛ const date2 = Temporal.PlainDateTime.from('2026-02-22T10:30:00')؛

// largeUnit نمائندگی کرنے کے لیے وقت کی سب سے بڑی اکائی بتاتی ہے۔ // مدت کے حساب کتاب میں const diff = date2.since(date1, { largeUnit: 'day' });

console.log(diff.days)؛ // 1

console.log(diff.hours)؛ // 1

console.log(diff.minutes)؛ // 30

console.log(diff.toString())؛ // P1DT1H30M // (ISO 8601 دورانیہ کی تار: 1 دن، 1 گھنٹہ، 30 منٹ)

تاریخوں اور اوقات کا موازنہ کرنا لمحہ اور وقتی دونوں آپ کو تاریخوں اور اوقات کا موازنہ کرنے دیتے ہیں تاکہ یہ تعین کیا جا سکے کہ کون سا دوسرے سے پہلے آتا ہے، لیکن API کے ساتھ مختلف طریقے اختیار کرتے ہیں۔ Moment دو مومنٹ اشیاء کا موازنہ کرنے کے لیے isBefore، isAfter، اور isSame جیسے طریقے فراہم کرتا ہے۔ const date1 = moment('2026-02-21T09:00:00')؛ const date2 = moment('2026-02-22T10:30:00')؛

console.log(date1.isBefore(date2))؛ // سچ

Temporal ایک ہی قسم کی دو اشیاء کے درمیان موازنہ کرنے کے لیے ایک جامد موازنہ کا طریقہ استعمال کرتا ہے۔ اگر پہلی تاریخ دوسری سے پہلے آتی ہے تو یہ -1، 0 اگر وہ برابر ہیں، یا 1 اگر پہلی تاریخ دوسری کے بعد آتی ہے۔ درج ذیل مثال سے پتہ چلتا ہے کہ دو PlainDate اشیاء کا موازنہ کیسے کیا جائے۔ Temporal.PlainDate.compare کے دونوں دلائل PlainDate آبجیکٹ ہونے چاہئیں۔

const date1 = Temporal.PlainDate.from({ سال: 2026، مہینہ: 2، دن: 24})؛ const date2 = Temporal.PlainDate.from({ سال: 2026، مہینہ: 3، دن: 24})؛

// date1 date2 سے پہلے آتا ہے، لہذا -1 console.log(Temporal.PlainDate.compare(date1, date2));

// اگر ہم مختلف اقسام کی دو اشیاء کا موازنہ کرنے کی کوشش کرتے ہیں تو غلطی console.log(Temporal.PlainDate.compare(date1, Temporal.Now.instant())); // TypeError: عارضی خرابی: غلط PlainDate فیلڈز فراہم کی گئیں۔

خاص طور پر، یہ وقتی اشیاء کی ایک صف کو تاریخ کے لحاظ سے ترتیب دینا آسان بناتا ہے۔ // Temporal.PlainDate اشیاء کی ایک صف const تاریخیں = [... ]؛

// Temporal.PlainDate.compare کو کمپیریٹر فنکشن کے طور پر استعمال کریں۔ dates.sort(Temporal.PlainDate.compare)؛

ٹائم زون کی تبدیلیاں کور مومنٹ لائبریری ٹائم زون کی تبدیلیوں کو سپورٹ نہیں کرتی ہے۔ اگر آپ کو اس فعالیت کی ضرورت ہے، تو آپ کو لمحہ ٹائم زون پیکیج بھی انسٹال کرنا ہوگا۔ یہ پیکج درخت سے ہلنے والا نہیں ہے، اور اس وجہ سے آپ کے بنڈل کے سائز میں نمایاں اضافہ ہو سکتا ہے۔ ایک بار جب آپ مومنٹ ٹائم زون انسٹال کر لیتے ہیں، تو آپ tz طریقہ کے ساتھ مومنٹ آبجیکٹ کو مختلف ٹائم زونز میں تبدیل کر سکتے ہیں۔ دوسرے مومنٹ آپریشنز کی طرح، یہ بنیادی کو تبدیل کرتا ہے۔اعتراض // امریکی مشرقی وقت فرض کرنا const now = لمحہ()؛ console.log(اب)؛ // لمحہ<2026-02-28T20:08:20-05:00>

// پیسیفک ٹائم میں تبدیل کریں۔ // اصل مشرقی وقت کھو گیا ہے۔ now.tz('America/Los_Angeles')؛ console.log(اب)؛ // لمحہ<2026-02-28T17:08:20-08:00>

ٹائم زون کی فعالیت کو Temporal.ZonedDateTime آبجیکٹ کا استعمال کرتے وقت Temporal API میں بنایا جاتا ہے۔ ان اشیاء میں ایک withTimeZone طریقہ شامل ہے جو ایک نیا ZonedDateTime لوٹاتا ہے جو وقت میں ایک ہی لمحے کی نمائندگی کرتا ہے، لیکن مخصوص ٹائم زون میں۔ // ایک بار پھر، یو ایس ایسٹرن ٹائم فرض کرتے ہوئے۔ const now = Temporal.Now.zonedDateTimeISO(); console.log(now.toLocaleString())؛ // 28/2/2026، 8:12:02 PM EST

// پیسیفک ٹائم میں تبدیل کریں۔ const nowPacific = now.withTimeZone('America/Los_Angeles')؛ console.log(nowPacific.toLocaleString())؛ // 28/2/2026، شام 5:12:02 PST

// اصل چیز میں کوئی تبدیلی نہیں ہے۔ console.log(now.toLocaleString())؛ // 28/2/2026، 8:12:02 PM EST

نوٹ: toLocaleString کی طرف سے واپس کردہ فارمیٹ شدہ اقدار، جیسا کہ نام سے ظاہر ہوتا ہے، لوکل پر منحصر ہے۔ نمونہ کوڈ این-US لوکل میں تیار کیا گیا تھا، لہذا فارمیٹ اس طرح ہے: 2/28/2026، 5:12:02 PM PST۔ کسی دوسرے مقام میں، یہ مختلف ہو سکتا ہے۔ مثال کے طور پر، en-GB لوکل میں، آپ کو 28/2/2026، 17:12:02 GMT-8 جیسا کچھ ملے گا۔ ایک حقیقی دنیا کی ریفیکٹرنگ فرض کریں کہ ہم ٹائم زونز میں ایونٹس کو شیڈول کرنے کے لیے ایک ایپ بنا رہے ہیں۔ اس ایپ کا حصہ ایک فنکشن ہے، getEventTimes، جو ایک ISO 8601 سٹرنگ لیتا ہے جو ایونٹ کے وقت اور تاریخ، ایک مقامی ٹائم زون، اور ٹارگٹ ٹائم زون کی نمائندگی کرتا ہے۔ فنکشن دونوں ٹائم زونز میں ایونٹ کے لیے فارمیٹ شدہ وقت اور تاریخ کے تار بناتا ہے۔ اگر فنکشن کو ایک ان پٹ سٹرنگ دی جاتی ہے جو درست وقت/تاریخ کی تار نہیں ہے، تو یہ ایک غلطی پھینک دے گا۔ یہاں اصل عمل درآمد ہے، مومنٹ کا استعمال کرتے ہوئے (مومنٹ ٹائم زون پیکیج کے استعمال کی بھی ضرورت ہوتی ہے)۔

'لمحہ ٹائم زون' سے لمحہ درآمد کریں؛

فنکشن getEventTimes(inputString, userTimeZone, targetTimeZone) { const timeFormat = 'MMM D, YYYY, h:mm:ss a z';

// 1. صارف کے ٹائم زون میں ابتدائی لمحہ بنائیں const eventTime = moment.tz( inputString، moment.ISO_8601، // ISO 8601 سٹرنگ کی توقع کریں۔ سچ، // سخت تجزیہ صارف ٹائم زون );

// اگر inputString نے درست تاریخ کی نمائندگی نہیں کی تو ایک غلطی پھینک دیں۔ اگر (!eventTime.isValid()) { نئی خرابی پھینک دیں ('غلط تاریخ/وقت ان پٹ')؛ }

// 2. ہدف کے وقت کا حساب لگائیں۔ // تنقیدی: ہمیں کلون کرنا چاہیے، یا 'ایونٹ ٹائم' ہمیشہ کے لیے بدل جائے گا! const targetTime = eventTime.clone().tz(targetTimeZone)؛

واپسی { مقامی: eventTime.format(timeFormat)، ہدف: targetTime.format(timeFormat)، }; }

const شیڈول = getEventTimes ( '2026-03-05T15:00-05:00'، 'امریکہ/نیو_یارک'، 'یورپ/لندن'، );

console.log(schedule.local)؛ // مارچ 5، 2026، 3:00:00 بجے EST

console.log(schedule.target)؛ // 5 مارچ، 2026، شام 8:00:00 GMT

اس مثال میں، ہم ISO 8601 کا متوقع تاریخ کا فارمیٹ استعمال کر رہے ہیں، جو مددگار طریقے سے Moment میں بنایا گیا ہے۔ ہم سخت تجزیہ بھی استعمال کر رہے ہیں، جس کا مطلب ہے کہ مومنٹ تاریخ کے اسٹرنگ سے اندازہ لگانے کی کوشش نہیں کرے گا جو فارمیٹ سے مماثل نہیں ہے۔ اگر ایک غیر آئی ایس او ڈیٹ سٹرنگ کو پاس کیا جاتا ہے، تو اس کا نتیجہ غلط ڈیٹ آبجیکٹ کی صورت میں نکلے گا، اور ہم ایک غلطی پھینک دیتے ہیں۔ عارضی نفاذ ایک جیسا نظر آتا ہے، لیکن اس میں کچھ اہم فرق ہیں۔

فنکشن getEventTimes(inputString, userTimeZone, targetTimeZone) { // 1. ان پٹ کو براہ راست ایک فوری میں پارس کریں، پھر تخلیق کریں۔ // صارف کے زون میں ایک زونڈ ڈیٹ ٹائم۔ const instant = Temporal.Instant.from(inputString)؛ const eventTime = instant.toZonedDateTimeISO(userTimeZone)؛

// 2. ٹارگٹ زون میں تبدیل کریں۔ // یہ خود بخود ایک نئی چیز لوٹاتا ہے۔ 'ایونٹ ٹائم' محفوظ ہے۔ const targetTime = eventTime.withTimeZone(targetTimeZone)؛

// 3. Intl (بلٹ ان) کا استعمال کرتے ہوئے فارمیٹ const اختیارات = { سال: 'عددی'، مہینہ: 'مختصر'، دن: 'عددی'، گھنٹے: 'عددی'، منٹ: '2 ہندسوں'، دوسرا: '2 ہندسوں'، ٹائم زون کا نام: 'مختصر' };

واپسی { مقامی: eventTime.toLocaleString(navigator.language، اختیارات)، ہدف: targetTime.toLocaleString(navigator.language، اختیارات) }; }

const شیڈول = getEventTimes ( '2026-03-05T15:00-05:00'، 'امریکہ/نیو_یارک'، 'یورپ/لندن'، );

console.log(schedule.local)؛ // مارچ 5، 2026، 3:00:00 PM EST

console.log(schedule.target)؛ // 5 مارچ، 2026، 8:00:00 PM GMT

Moment کے ساتھ، ہمیں واضح طور پر نتیجے میں آنے والی تاریخ کے تاروں کے لیے فارمیٹ سٹرنگ کی وضاحت کرنی ہوگی۔ صارف کے مقام یا مقام سے قطع نظر، ایونٹ کے اوقات ہمیشہ 5 مارچ 2026، 3:00:00 کے طور پر فارمیٹ کیے جائیں گے۔شام EST اس کے علاوہ، ہمیں واضح طور پر ایک استثناء پھینکنے کی ضرورت نہیں ہے۔ اگر کوئی غلط سٹرنگ Temporal.Instant.from کو بھیجی جاتی ہے، تو Temporal ہمارے لیے استثنیٰ دے گا۔ ایک بات نوٹ کرنے کی ہے کہ سخت تجزیہ کرنے کے باوجود بھی مومنٹ ورژن زیادہ نرم ہے۔ Temporal کو سٹرنگ کے آخر میں ٹائم زون آفسیٹ کی ضرورت ہوتی ہے۔ آپ کو یہ بھی نوٹ کرنا چاہیے کہ چونکہ ہم navigator.language استعمال کر رہے ہیں، اس لیے یہ کوڈ صرف براؤزر کے ماحول میں چلے گا، کیونکہ نیویگیٹر کی تعریف Node.js ماحول میں نہیں کی گئی ہے۔ عارضی نفاذ براؤزر کے موجودہ مقام (navigator.language) کا استعمال کرتا ہے، لہذا صارف خود بخود ایونٹ کے اوقات کو اپنے مقامی وقت کی شکل میں فارمیٹ کر دے گا۔ این-یو ایس لوکل میں، یہ 5 مارچ 2026، 3:00:00 بجے EST ہے۔ تاہم، اگر صارف لندن میں ہے، مثال کے طور پر، ایونٹ کے اوقات 5 مارچ 2026، 15:00:00 GMT-5 کے طور پر فارمیٹ کیے جائیں گے۔ خلاصہ

ایکشن Moment.js وقتی موجودہ وقت لمحہ() Temporal.Now.zonedDateTimeISO() آئی ایس او کو پارس کرنا لمحہ(str) Temporal.Instant.from(str) وقت شامل کریں۔ .add(7, 'days') (تبدیلیاں) شامل کریں ({ دن: 7 }) (نئی چیز) فرق .diff (دیگر، 'گھنٹے') .جب سے (دیگر) گھنٹے ٹائم زون .tz('زون/نام') .withTimeZone('زون/نام')

پہلی نظر میں، فرق تھوڑا مختلف ہو سکتا ہے (اور Temporal کی صورت میں، کبھی کبھی زیادہ لفظی اور زیادہ سخت) نحو، لیکن Temporal over Moment.js استعمال کرنے کے کئی اہم فوائد ہیں:

زیادہ واضح ہونے کا مطلب ہے کم حیرت اور غیر ارادی کیڑے۔ لمحہ زیادہ نرم دکھائی دے سکتا ہے، لیکن اس میں "اندازہ کاری" شامل ہے، جس کے نتیجے میں بعض اوقات غلط تاریخیں بھی نکل سکتی ہیں۔ اگر آپ Temporal کو کچھ غلط دیتے ہیں، تو یہ ایک خرابی پھینک دیتا ہے۔ اگر کوڈ چلتا ہے، تو آپ جانتے ہیں کہ آپ کو ایک درست تاریخ مل گئی ہے۔ لمحہ ایپلیکیشن کے بنڈل میں اہم سائز کا اضافہ کر سکتا ہے، خاص طور پر اگر آپ لمحہ ٹائم زون پیکیج استعمال کر رہے ہیں۔ عارضی کچھ بھی شامل نہیں کرتا ہے (ایک بار جب یہ آپ کے ہدف والے براؤزرز میں بھیج دیا جاتا ہے)۔ تغیر پذیری آپ کو یہ اعتماد فراہم کرتی ہے کہ آپ تاریخ کی تبدیلیوں اور کارروائیوں کو انجام دیتے وقت کبھی بھی ڈیٹا کو ضائع یا اوور رائٹ نہیں کریں گے۔ وقت کی مختلف نمائندگییں (انسٹنٹ، پلین ڈیٹ ٹائم، زونڈ ڈیٹ ٹائم) آپ کی ضروریات کے لحاظ سے، جہاں لمحہ ہمیشہ UTC ٹائم اسٹیمپ کے گرد لپیٹتا ہے۔ Temporal تاریخ کی فارمیٹنگ کے لیے Intl APIs کا استعمال کرتا ہے، جس کا مطلب ہے کہ آپ ٹوکن کو واضح طور پر بتائے بغیر لوکل سے آگاہ فارمیٹنگ کر سکتے ہیں۔

پولی فل پر نوٹس جیسا کہ پہلے ذکر کیا گیا ہے، ایک Temporal polyfill دستیاب ہے، جسے @js-temporal/polyfill کے نام سے npm پیکیج کے طور پر تقسیم کیا گیا ہے۔ اگر آپ آج ہی Temporal استعمال کرنا چاہتے ہیں، تو آپ کو Safari جیسے براؤزرز کو سپورٹ کرنے کے لیے اس پولی فل کی ضرورت ہوگی جنہوں نے ابھی تک API نہیں بھیجے ہیں۔ اس کے ساتھ بری خبر یہ ہے کہ یہ آپ کے بنڈل کے سائز میں اضافہ کرے گا۔ اچھی خبر یہ ہے کہ یہ اب بھی لمحہ یا لمحہ ٹائم زون سے نمایاں طور پر کم اضافہ کرتا ہے۔ یہاں بنڈل کے سائز کا موازنہ ہے جیسا کہ Bundlephobia.com نے رپورٹ کیا ہے، ایک ویب سائٹ جو npm پیکیج کے سائز کے بارے میں معلومات پیش کرتی ہے (Bundlephobia تجزیہ دیکھنے کے لیے ہر پیکیج کے نام پر کلک کریں):

پیکج minified چھوٹے اور gzipped @js-temporal/polyfill 154.1 kB 44.1 kB لمحہ 294.4 kB 75.4 kB لمحہ ٹائم زون 1 MB 114.2 kB

پولی فل میں تاریخی طور پر میموری کے استعمال کے ارد گرد کارکردگی کے کچھ مسائل تھے، اور لکھنے کے وقت، اسے الفا حالت میں سمجھا جاتا ہے۔ اس کی وجہ سے، آپ اسے پیداوار میں استعمال نہیں کرنا چاہیں گے جب تک کہ یہ زیادہ پختہ حالت میں نہ پہنچ جائے۔ دوسری اچھی خبر یہ ہے کہ امید ہے کہ پولی فل کی زیادہ دیر ضرورت نہیں پڑے گی (جب تک کہ آپ کو پرانے براؤزرز کو سپورٹ کرنے کی ضرورت نہ ہو)۔ لکھنے کے وقت، ٹیمپورل کروم، ایج اور فائر فاکس میں بھیج دیا گیا ہے۔ یہ ابھی تک سفاری میں بالکل تیار نہیں ہے، حالانکہ ایسا لگتا ہے کہ یہ جدید ترین ٹیکنالوجی پیش نظارہ پر رن ​​ٹائم پرچم کے ساتھ دستیاب ہے۔

You May Also Like

Enjoyed This Article?

Get weekly tips on growing your audience and monetizing your content — straight to your inbox.

No spam. Join 138,000+ creators. Unsubscribe anytime.

Create Your Free Bio Page

Join 138,000+ creators on Seemless.

Get Started Free