البرمجة

فارق توقيت DateDiff في PHP

مشكلة تعود لاختلافات في المنطقة الزمنية بين توقيت أوروبا/براغ وتوقيت الولايات المتحدة/المحيط الهادئ، حيث تظهر فروقات في النتائج عند استخدام دالة DateDiff في PHP. عند قيامك بإضافة شهر واحد إلى تاريخ معين ومن ثم حساب الفارق بين التواريخ، قد تتغير النتيجة باختلاف المنطقة الزمنية المستخدمة.

في المثال الذي ذكرته، استخدمت منطقة زمنية Europe/Prague ومنطقة زمنية US/Pacific. وقد لوحظ أن الفارق في التوقيت بين الشهرين يختلف بين المناطق الزمنية المختلفة.

عندما تقوم بإضافة شهر واحد إلى تاريخ معين، يجب أن تأخذ في الاعتبار الفروقات الناجمة عن التوقيت الصيفي وغيرها من التغييرات في التوقيت. في الولايات المتحدة، على سبيل المثال، تختلف سياسات التوقيت الصيفي من ولاية إلى أخرى، مما يؤدي إلى اختلافات في النتائج.

لحل هذه المشكلة والحصول على نتيجة موحدة ومتوقعة، يمكنك استخدام دالة أخرى مثل date_add وتعيين المدة بشكل محدد بدلاً من استخدام ‘P1M’ الذي قد يؤدي إلى تفسيرات متغيرة حسب المنطقة الزمنية. على سبيل المثال:

php
date_default_timezone_set("Europe/Prague"); $from = new \DateTimeImmutable('2016-09-01'); $to = date_add($from, date_interval_create_from_date_string('1 month')); var_dump($from); var_dump($to); var_dump($from->diff($to)->m); var_dump($from->diff($to)->d);

وهذا سيعطي نفس النتائج في كل المناطق الزمنية، بغض النظر عن السياسات المحلية للتوقيت.

المزيد من المعلومات

في السياق ذاته، يُظهر الكود المُعرض في المثالين الفروقات الناتجة عن استخدام الدالة diff في PHP بين التواريخ المُضافة. على الرغم من أنه من المتوقع أن يكون الفارق بين التواريخ في كلتا المنطقتين الزمنيتين شهر واحد، فإن الفارق الفعلي يظهر تباينًا بسبب اختلافات التوقيت بين المناطق الزمنية.

توضح النتائج المطبوعة بوضوح الفارق في النتائج:

في المنطقة الزمنية Europe/Prague:

  • التاريخ الأصلي: 2016-09-01
  • التاريخ المُضاف بعد شهر واحد: 2016-10-01
  • الفارق في الشهور: 0
  • الفارق في الأيام: 30

في المنطقة الزمنية US/Pacific:

  • التاريخ الأصلي: 2016-09-01
  • التاريخ المُضاف بعد شهر واحد: 2016-10-01
  • الفارق في الشهور: 1
  • الفارق في الأيام: 0

لحل هذا التباين والحصول على نتائج موحدة، يمكن استخدام الدالة date_add بدلاً من الاعتماد على add مع DateInterval، كما هو موضح في الشفرة المقدمة. هذا يضمن استخدام نفس الطريقة في جميع المناطق الزمنية ويقلل من تأثير اختلافات التوقيت.

بالتالي، يجب أن يتم فحص الكود وتحسينه بما يتناسب مع احتياجات التطبيق ومتطلبات التوقيت، وينبغي أيضًا اختباره بشكل متكرر عبر مجموعة متنوعة من المناطق الزمنية للتأكد من أنه يُظهر السلوك المتوقع بغض النظر عن التوقيت.

زر الذهاب إلى الأعلى