العمل مع التواريخ والوقت في TypeScript: من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا يتطلب العمل مع التواريخ في TypeScript اهتمامًا خاصًا

\n\n

العمل مع التواريخ والوقت هو أحد أكثر المهام شيوعًا وفي نفس الوقت غدرًا في تطوير الويب. في TypeScript، الذي يعتبر طبقة علوية صارمة في التوصيف فوق JavaScript، ورث الكائن Date جميع "مزايا" سلفه: أشهر غير بديهية (العد من الصفر)، قابلية تغيير الطرق، ومشاكل المناطق الزمنية. ومع ذلك، باستخدام التوصيف الصارم والمكتبات الحديثة، يمكنك كتابة كود آمن وقابل للتنبؤ وسهل القراءة للعمل مع الوقت.

\n\n

في هذه المقالة، سنشرح كل ما يحتاج المطور معرفته: من الإنشاء الأساسي للتواريخ إلى العمل المتقدم مع المناطق الزمنية والتنسيق. ستتعلم كيفية تجنب الأخطاء النموذجية وما هي الأدوات (المدمجة والجهات الخارجية) الأفضل لمشاريع TypeScript.

\n\n

1. الأساسيات: كائن Date وتوصيفه في TypeScript

\n\n

الإنشاء والطرق الأساسية

\n\n

في TypeScript، كما في JavaScript، يتم استخدام الكائن المدمج Date للعمل مع التواريخ. يوفر TypeScript أنواعًا جاهزة له، لذلك لا حاجة لتعريفات إضافية.

\n\n
// إنشاء التاريخ الحالي\nconst now: Date = new Date();\nconsole.log(now); // 2024-01-15T10:30:00.000Z\n\n// الإنشاء من سلسلة نصية (ISO 8601)\nconst specificDate: Date = new Date('2024-12-31T23:59:59');\n\n// الإنشاء من المكونات (السنة، الشهر [0-11]، اليوم، الساعات...)\nconst birthday: Date = new Date(1990, 0, 15); // 15 يناير 1990\n// انتبه: الشهر 0 = يناير!
\n\n

مشكلة قابلية التغيير

\n\n

طرق كائن Date تغير الكائن الأصلي. هذا يمكن أن يؤدي إلى أخطاء غير متوقعة. لا يمكن لـ TypeScript منع ذلك على مستوى الأنواع، ولكن يمكنك استخدام طرق غير قابلة للتغيير.

\n\n
const date = new Date('2024-01-01');\ndate.setDate(date.getDate() + 5); // تغيير! date الآن 6 يناير\n// الأفضل إنشاء كائن جديد:\nconst newDate = new Date(date.getTime() + 5 * 24 * 60 * 60 * 1000);
\n\n

توصيف Unix Timestamp

\n\n

غالبًا ما يتم تمرير التواريخ كأرقام (مللي ثانية منذ 1970). استخدم type alias للوضوح:

\n\n
type UnixTimestamp = number;\n\nfunction formatTimestamp(ts: UnixTimestamp): string {\n  return new Date(ts).toISOString();\n}\n\nconst myTimestamp: UnixTimestamp = 1705315200000;\nconsole.log(formatTimestamp(myTimestamp));
\n\n

2. تنسيق وتحليل التواريخ

\n\n

طرق التنسيق المدمجة

\n\n

توفر JavaScript طرقًا أساسية للإخراج المترجم. في TypeScript تعمل "خارج الصندوق":

\n\n
const date = new Date('2024-06-15T14:30:00');\n\n// سلاسل مترجمة\nconsole.log(date.toLocaleDateString('ar-SA')); // "١٥/٠٦/٢٠٢٤"\nconsole.log(date.toLocaleTimeString('en-US')); // "2:30:00 PM"\nconsole.log(date.toLocaleString('de-DE'));     // "15.6.2024, 14:30:00"\n\n// سلسلة ISO (مناسبة لـ API)\nconsole.log(date.toISOString()); // "2024-06-15T11:30:00.000Z" (دائمًا UTC)
\n\n

تحليل السلاسل: المخاطر

\n\n

تحليل السلاسل عبر المُنشئ new Date(str) يمكن أن يعطي نتائج غير متوقعة في متصفحات مختلفة. من الأفضل استخدام Date.parse() مع فحص صريح أو مكتبات خارجية.

\n\n
// طريقة غير موثوقة\nconst parsed = new Date('2024/01/15'); // قد يعمل بشكل غير مستقر\n\n// طريقة موثوقة: ISO 8601\nconst safeParse = (dateStr: string): Date | null => {\n  const ts = Date.parse(dateStr);\n  return isNaN(ts) ? null : new Date(ts);\n};\n\nconst result = safeParse('2024-01-15T10:00:00Z');\nif (result) {\n  console.log(result.toISOString());\n}
\n\n

3. المعالجة المتقدمة والمقارنة

\n\n

مقارنة التواريخ

\n\n

يمكن مقارنة التواريخ مباشرة عبر عوامل المقارنة، ولكن للمقارنة الدقيقة (المساواة) يجب تحويلها إلى رقم:

\n\n
const date1 = new Date('2024-01-01');\nconst date2 = new Date('2024-01-0                

المدونات

توصيات الكتب