كيفية الحصول على UNIX_TIMESTAMP لعدم تعويض حقل DateTime عند في مناطق زمنية مختلفة؟

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

سؤال

لقد بنيت منتدى صغير حيث يمكن للمستخدمين نشر الرسائل. خادمي في الولايات المتحدة، ولكن UserBase للمنتدى في تايوان (+ 15 ساعة).

عندما ينشر شخص ما في النموذج، أقوم بتخزين الوقت في قاعدة بيانات MySQL الخاصة بي بتنسيق YYYY-MM-DD HH: MM: SS. عندما أنظر في قاعدة البيانات، يعرض الوقت الوقت المناسب (انتهت الوقت الذي نشره الشخص في تايوان).

ومع ذلك، عندما أستخدم UNIX_TIMESTAMP للحصول على تاريخ الخروج من قاعدة البيانات، يتم تغيير الوقت.

مثال:

  1. أنا نشر شيء إلى المنتدى. DateTime على Wrist Watch هو 2009-10-2 11:24 AM (تايوان)
  2. أنا أنظر في قاعدة البيانات وتقول تاريخ DateTime 2009-10-2 11:24 صباحا (نفس الوقت كما ساعة معصمي. جيد!)
  3. ثم عندما أستخدم UNIX_TIMESTAMP لعرض التاريخ على موقع الويب الخاص بي، فإنه يظهر 2009-10-03 4:22 مساء (سيئا! تطبيق إزاحة)

هل هناك طريقة يمكنني الحصول على Unix_timestamp للتوقف عن تحويل الوقت (تطبيق إزاحة) عند الاستعلام عن التاريخ من قاعدة البيانات؟

معلومات اضافية:
أنا أستخدم PHP.
لقد قمت بتعيين TimeZone في PHP الخاص بي إلى تايوان (date.timezone = آسيا / تايبيه)
إذا كان المستخدم في timezone آخر من تايوان، فأنا أريد ذلك تحويل الوقت إلى وقت تايبيه. الموقع ما يقرب من 100٪ تايوان تستخدم لذلك أريد فقط وقت تايوان لإظهار طوال الوقت حتى لو كانوا في timezone آخر.
أقوم بعرض التاريخ في الكثير من المجالات حول الموقع في تنسيقات تاريخ مختلفة ().
في الأساس كل شيء يعمل بشكل رائع إلا أنه عندما أستخدم UNIX_TIMESTAMP للاستعلام عن البيانات، فإنه يطبق إزاحة إلى الوقت.

شكرا!

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

المحلول 4

لقد وجدت حلا ممكنا وهو مجرد استرداد التاريخ من قاعدة البيانات دون تحويله إلى وقت UNIX، ثم فقط باستخدام Strtotime ()؛ لتحويله إلى وقت UNIX. أساسا بدلا من التحويل باستخدام SQL، أنا محول باستخدام PHP. الأشياء الوحيدة التي لا أحبها هي: strtotime () <أنا لست متأكدا من مدى موثوقية هذه الوظيفة، ويجب أن أذهب وتغيير حوالي 100 مكان حيث أستخدم UNIX_TIMESTAMP (DOH!)

هل هناك اي طرق اخرى؟

نصائح أخرى

يكتب MySQL تواريخ "AS-IS"، كما يقرأها أيضا، لكن Unix_timestamp يعامل أي تواريخ إدخال كما هو الحال في TIMEZONE المحلي وتحويلها إلى TimeStamps UTC / GMT، مما يعني أنه سيقوم بتطبيق إزاحة التوقيت المحلي الخاص بك، الآن إذا قمت بمعالجة الطوابع الزمنية التي تم إرجاعها من mysql عبر على سبيل المثال تاريخ PHP () سوف يطبق مرة أخرى إزاحة التوقيت المحلي الخاص بك (ملاحظة هناك أيضا gm gm () التي لا تفعل ذلك)، والتي ستنتج نتائج غير مرغوب فيها.

ولكن يمكنك الحصول على هذه الخدعة التالية التي ستقوم بطرح TimeZone الجلسة الخاصة بك قبل تطبيق UNIX_TIMESTAMP ()، لذلك ستحصل على الرقم الدقيق بغض النظر عن الخادم / timezone المحلي إذا كنت تريد نفس التاريخ بالضبط في DB كما لو كان بتوقيت جرينتش الوقت.

mysql> SELECT UNIX_TIMESTAMP(CONVERT_TZ("2013-05-27","GMT",@@session.time_zone));
+--------------------------------------------------------------------+
| UNIX_TIMESTAMP(CONVERT_TZ("2013-05-27","GMT",@@session.time_zone)) |
+--------------------------------------------------------------------+
|                                                         1369612800 |
+--------------------------------------------------------------------+
1 row in set (0.00 sec)

سيكون حل آخر لتعيين الخوادم أو Deading TimeZone إلى 0 (بتوقيت جرينتش)، لذلك لن تكون هناك تحويلات حقيقية تحدث.

MySQL يأخذ إعداد TimeZone الافتراضي للنظام إلا إذا أخبرت خلاف ذلك، فإنه يفسر المشكلات التي تواجهها؛ ألق نظرة على MySQL وحدة زمنية دليل مراجع لمزيد من التفاصيل. استنادا إلى تجربتي السابقة، جئت إلى استنتاج UTC هو الخيار الأفضل لتخزين تاريخ ووقت؛ عند عرضه للمستخدم، يتم تحويلها إلى TimeZone في المستخدم.

إذا كان ذلك ممكنا، قم بتغيير جميع إدخالات التاريخ والوقت في DB إلى UTC، قم بتكوين TimeZone في PHP باستخدامdate_default_timezone_set()وتأكد من تحويله بشكل صحيح عند تقديمه إلى المستخدم وعند تخزينها في قاعدة البيانات أيضا. إذا لم يكن تخزين قيم UTC خيارا، فقد تقوم ببساطة بتحويلها عن طريق مرجع المرجع بالمنطقة الزمنية بنفس الطريقة كما هو الحال مع UTC.

ما عليك القيام به هو الاستيلاء على التاريخ والوقت الخام من قاعدة البيانات ثم استخدم PHP DateTime. لتحويله. إلقاء نظرة على datetimezone. كذلك.

أفضل ما وجدته لهذه المشكلة هو استخدام هذا:

حدد unix_timestamp (convert_tz (<< >>، '+ 15:00'، '+ 00:00')) + timestampdiff (ثانية، utc_timestamp ()، الآن ())

مثال: أريد أن أحصل على الطابع الزمني 31 مايو 2012 في 23:59:59، بالتوقيت المحلي. حدد unix_timestamp (convert_tz ('2012-05-31 23:59:59'، '+ 15:00'، '+ 00:00')) + timestampdiff (ثانية، utc_timestamp ()، الآن ()، الآن ())

وبهذه الطريقة أحصل على Timestamp GMT-0، المقابلة للوقت المحلي.

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