it-swarm.asia

moment.js - UTC يعطي تاريخ خاطئ

لماذا تقوم moment.js UTC دائمًا بعرض التاريخ الخطأ. على سبيل المثال من وحدة تحكم مطور chrome:

moment(('07-18-2013')).utc().format("YYYY-MM-DD").toString()
// or
moment.utc(new Date('07-18-2013')).format("YYYY-MM-DD").toString()

كلاهما سيعود "2013-07-17" لماذا يعود 17 بدلا من 18 ، التي تم تمريرها في.

ولكن إذا كنت أستخدم أدوات مساعدة بدون utc:

moment(new Date('07-18-2013')).format("YYYY-MM-DD").toString()

أعود "2013-07-18" وهذا ما أتوقعه أيضًا عند استخدام moment.js UTC.

هل هذا يعني أننا لا نستطيع الحصول على التاريخ الصحيح عند استخدام moment.js UTC؟

71
brg

بشكل افتراضي ، يوزع MomentJS بالتوقيت المحلي. إذا تم توفير سلسلة تاريخ فقط (بدون وقت) ، فسيتم تعيين الوقت الافتراضي حتى منتصف الليل.

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

إذا كانت المنطقة الزمنية المحلية هي UTC + N (N رقمًا موجبًا) ، ويمكنك تحليل سلسلة تاريخ فقط ، فستحصل على التاريخ السابق.

فيما يلي بعض الأمثلة لتوضيح ذلك (إزاحة التوقيت المحلي الخاص بي هو UTC + 3 أثناء التوقيت الصيفي):

>>> moment('07-18-2013', 'MM-DD-YYYY').utc().format("YYYY-MM-DD HH:mm")
"2013-07-17 21:00"
>>> moment('07-18-2013 12:00', 'MM-DD-YYYY HH:mm').utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 09:00"
>>> Date()
"Thu Jul 25 2013 14:28:45 GMT+0300 (Jerusalem Daylight Time)"

إذا كنت تريد تفسير سلسلة التاريخ والوقت على أنها UTC ، فيجب أن تكون صريحًا حيال ذلك:

>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"

أو ، كما يذكر Matt Johnson في إجابته ، يمكنك ( وربما ينبغي ) تحليلها كتاريخ UTC في المقام الأول باستخدام moment.utc() وتضمين سلسلة التنسيق كوسيطة ثانية لمنع التباس.

>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"

للذهاب في اتجاه آخر وتحويل تاريخ UTC إلى تاريخ محلي ، يمكنك استخدام local() الطريقة ، كما يلي:

>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"
121
MasterAM

سيقوم كل من Date و moment بتحليل سلسلة الإدخال في المنطقة الزمنية المحلية للمتصفح بشكل افتراضي. لكن Date أحيانًا لا يتعارض مع هذا الصدد. إذا كانت السلسلة YYYY-MM-DD على وجه التحديد ، باستخدام الواصلات ، أو إذا كانت YYYY-MM-DD HH:mm:ss ، فسوف تفسرها على أنها بالتوقيت المحلي . بخلاف Date ، moment ستكون دائمًا متسقة حول كيفية تحليلها.

الطريقة الصحيحة لتحليل لحظة إدخال كتوقيت UTC بالتنسيق الذي قدمته ستكون كما يلي:

moment.utc('07-18-2013', 'MM-DD-YYYY')

الرجوع إلى هذه الوثائق .

إذا كنت ترغب في تنسيقه بشكل مختلف للإخراج ، فيمكنك القيام بذلك:

moment.utc('07-18-2013', 'MM-DD-YYYY').format('YYYY-MM-DD')

لا تحتاج إلى الاتصال بـ toString بشكل صريح.

لاحظ أنه من المهم جدًا توفير تنسيق الإدخال. بدون ذلك ، قد تتم معالجة تاريخ مثل 01-04-2013 إما في 4 يناير أو الأول من أبريل ، حسب إعدادات الثقافة في المتصفح.

25
Matt Johnson