التعامل مع خادم PHP وخادم MySQL في مناطق زمنية مختلفة

StackOverflow https://stackoverflow.com/questions/18449

سؤال

بالنسبة لأولئك منا الذين يستخدمون حزم الاستضافة المشتركة القياسية، مثل GoDaddy أو Network Solutions، كيف يمكنك التعامل مع تحويلات التاريخ والوقت عندما يكون خادم الاستضافة (PHP) وخادم MySQL في مناطق زمنية مختلفة؟

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

هل كانت مفيدة؟

المحلول

اعتبارًا من PHP 5.1.0، يمكنك استخدام date_default_timezone_set() وظيفة لتعيين المنطقة الزمنية الافتراضية التي تستخدمها جميع وظائف التاريخ/الوقت في البرنامج النصي.

بالنسبة إلى MySql (مقتبس من دعم المنطقة الزمنية لخادم MySQL صفحة)

قبل MySQL 4.1.3، كان الخادم يعمل فقط في المنطقة الزمنية للنظام التي تم ضبطها عند بدء التشغيل.بدءًا من MySQL 4.1.3، يحتفظ الخادم بالعديد من إعدادات المنطقة الزمنية، والتي يمكن تعديل بعضها في وقت التشغيل.

ما يثير اهتمامك هو إعداد المناطق الزمنية لكل اتصال، والذي ستستخدمه في بداية البرامج النصية الخاصة بك

SET timezone = 'Europe/London';

أما بالنسبة لاكتشاف إعداد المنطقة الزمنية للعميل، فيمكنك استخدام القليل من JavaScript للحصول على هذه المعلومات وحفظها في ملف تعريف الارتباط، واستخدامها في قراءات الصفحة اللاحقة، لحساب المنطقة الزمنية المناسبة.

//Returns the offset (time difference) between Greenwich Mean Time (GMT) 
//and local time of Date object, in minutes.
var offset = new Date().getTimezoneOffset(); 
document.cookie = 'timezoneOffset=' + escape(offset);

أو يمكنك أن تقدم للمستخدمين خيار تحديد مناطقهم الزمنية بأنفسهم.

نصائح أخرى

قم بتخزين كل شيء بالتوقيت العالمي المنسق (UTC).يمكنك إجراء التحويلات على مستوى العميل، أو على جانب الخادم باستخدام إعدادات العميل.

فب - التاريخ

MySQL - الطابع الزمني UTC

فيما يتعلق بالإجابة من Željko Živković، تعمل واصفات المنطقة الزمنية مثل "أوروبا/لندن" فقط إذا قام مسؤول MySQL بإضافة جداول المنطقة الزمنية إلى النظام، ويبقيها محدثة.

وإلا فستقتصر على الإزاحات الرقمية مثل "-4:00".لحسن الحظ فإن تنسيق php date('P') يوفر ذلك (اعتبارًا من 5.1.3)

لذلك لنفترض ملف تكوين التطبيق الذي قد يكون لديك

define('TZ', 'US/Pacific');
....
if (defined('TZ') && function_exists('date_default_timezone_set')) {
    date_default_timezone_set(TZ);
    $mdb2->exec("SET SESSION time_zone = " . $mdb2->quote(date('P')));
}

وهذا يعني أن PHP وmySQL سيتفقان على إزاحة المنطقة الزمنية التي سيتم استخدامها.

استخدم دائمًا TIMESTAMP لتخزين قيم الوقت.يتم تخزين العمود فعليًا كـ UNIX_TIME (عصر) ولكن يتم تحويله ضمنيًا من إزاحة المنطقة الزمنية الحالية عند كتابته والعودة عند القراءة.

إذا كنت تريد عرض الأوقات للمستخدمين في مناطق زمنية أخرى، فبدلاً من تحديد عالمي ()، قم بتعيين المنطقة الزمنية المحددة لهم في ما ورد أعلاه.سيتم تحويل قيم TIMESTAMP تلقائيًا بواسطة MySQL بحلول الوقت الذي يرى فيه تطبيقك مجموعة النتائج (وهو ما قد يمثل مشكلة في بعض الأحيان، إذا كنت تريد معرفة المنطقة الزمنية الأصلية للحدث أيضًا، فيجب أن تكون في عمود آخر)

وبقدر ما "لماذا لا تقوم فقط بتخزين جميع الأوقات كـ int's"، فهذا يفقدك القدرة على مقارنة التواريخ والتحقق من صحتها، ويعني أنك دائماً يجب عليك التحويل إلى تمثيل التاريخ على مستوى التطبيق (وهو أمر صعب على العين عندما تنظر إلى البيانات مباشرة - سريعًا، ماذا حدث في 1254369600؟)

أقوم بحفظ جميع التواريخ الخاصة بي باعتبارها كبيرة نظرًا لوجود مشكلات مع نوع dateTime من قبل.لقد قمت بحفظ نتيجة الدالة time() PHP فيها، والآن يتم احتسابها على أنها في نفس المنطقة الزمنية :)

في php، قم بتعيين المنطقة الزمنية في ملف php.ini: ini_set("date.timezone", "America/Los_Angeles");

أو في صفحة معينة يمكنك القيام بما يلي: date_default_timezone_set("America/Los_Angeles");

في MySQL يمكنك أن تفعل مثل: SET GLOBAL time_zone = 'America/Los_Angeles';

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top