Moment: تعذر العثور على اختصار المنطقة الزمنية من Date.prototype.toString ()

تم إنشاؤها على ٦ فبراير ٢٠١٢  ·  33تعليقات  ·  مصدر: moment/moment

مرحبًا ، تعرفت على موقع moment.js عبر منتدى ونقرت عليه ، عندما صادفت اختبار الوحدة - والذي فشل في اختبارين لما أريد الإبلاغ عنه هنا:

وكيل المستخدم:
Mozilla / 5.0 (Windows NT 6.1 ؛ WOW64) AppleWebKit / 535.7 (KHTML ، مثل Gecko) Chrome / 16.0.912.77 Safari / 535.7 (Chrome 16.0.912.77 م)

وحدة زمنية:
التوقيت العالمي المتفق عليه +1

الاختبارات الفاشلة (# 28):
http://pastebin.com/bQsDuxdH

* تم تحرير العنوان بواسطة timrwood

Bug

التعليق الأكثر فائدة

سؤال غبي: لماذا مكتبة جديدة تمامًا؟ أليس الهدف من Moment هو حل جميع احتياجات التعامل مع التاريخ والوقت؟ بينما تضيف ملفات البيانات مقدارًا غير تافه من المساحة (ويمكنني أن أفهم فصلها) ، فإن المكتبة الجديدة نفسها أقل من 2 كيلو بايت ، لذلك لا يبدو أن المساحة سبب لفصلها.

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

أيضًا ، كيف يمكنني استخدام هذا الدمج الجديد للمكتبات لإنشاء سلسلة تاريخ بسيطة؟ قبل أن أتمكن من إنشاء:

Sun, 06 Nov 1994 08:49:37 GMT

مع:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

لكني الآن في حيرة من أمري فيما يتعلق بكيفية القيام بذلك بدون خيار التنسيق "z". سيكون موضع تقدير أي مساعدة.

ال 33 كومينتر

حسنًا ، يبدو أن اختصار المنطقة الزمنية فشل. آسف لإجراء التصحيح عن بعد ، ولكن ما هو ناتج ما يلي في الكروم؟

new Date().toString()

أيضا ، ما هو اسم المنطقة الزمنية التي أنت فيها؟

أحصل على نفس الخطأ في اختبارات الوحدة وأنا في UTC + 1 (المعروف سابقًا باسم GMT + 1) أيضًا.

new Date (). toString () يطبع "السبت 11 فبراير 2012 02:15:10 GMT + 0100" في Firefox 10 ، "السبت 11 فبراير 2012 02:18:29 GMT + 0100 (توقيت غرب أوروبا)" في Chrome 16 و "السبت 11 فبراير 02:18:59 بالتوقيت العالمي المنسق + 0100 2012" في Internet Explorer 9

حسنًا ، كنت خائفًا من هذا. المشكلة هي أن Date.prototype.toString يعرض مثل هذه النتائج المختلفة. هذا هو المكان الوحيد للحصول على اسم المنطقة الزمنية (PST ، CST ، EST ، إلخ). إذا كانت هذه الطريقة لا تعرض أي معلومات عن المنطقة الزمنية (كما هو الحال مع FF10 و IE9 ، فلا توجد طريقة للحصول عليها.

ربما حان الوقت للتخفيض؟ أم أنه من المقبول ملاحظة المشكلة فقط في المستندات؟

مر 4318 ، فشل 2. 2715 مللي ثانية.

Mozilla / 5.0 (Windows NT 6.1) AppleWebKit / 535.11 (KHTML ، مثل Gecko) Chrome / 17.0.963.56 Safari / 535.11

UTC +2 (كييف ، أوكرانيا)

مرت تنسيق المنطقة الزمنية 2 وفشل 2.
---> شيء مثل "PST"
AssertionError: ---> شيء مثل "PST"
في Object.ok (http://momentjs.com/js/tests.js؟_=120203_183019:1526:39)
على http://momentjs.com/js/tests.js؟_=120203_183019:2413:14
في Object.runTest (http://momentjs.com/js/tests.js؟_=120203_183019:1702:9)
على http://momentjs.com/js/tests.js؟_=120203_183019:1748:25
على http://momentjs.com/js/tests.js؟_=120203_183019:1006:13
على http://momentjs.com/js/tests.js؟_=120203_183019:616:13
على http://momentjs.com/js/tests.js؟_=120203_183019:627:25
على http://momentjs.com/js/tests.js؟_=120203_183019:1008:17
على http://momentjs.com/js/tests.js؟_=120203_183019:1589:17
---> شيء مثل "PST"
AssertionError: ---> شيء مثل "PST"
في Object.ok (http://momentjs.com/js/tests.js؟_=120203_183019:1526:39)
على http://momentjs.com/js/tests.js؟_=120203_183019:2414:14
في Object.runTest (http://momentjs.com/js/tests.js؟_=120203_183019:1702:9)
على http://momentjs.com/js/tests.js؟_=120203_183019:1748:25
على http://momentjs.com/js/tests.js؟_=120203_183019:1006:13
على http://momentjs.com/js/tests.js؟_=120203_183019:616:13
على http://momentjs.com/js/tests.js؟_=120203_183019:627:25
على http://momentjs.com/js/tests.js؟_=120203_183019:1008:17
على http://momentjs.com/js/tests.js؟_=120203_183019:1589:17
+02: 00 ---> شيء مثل "+07: 30"
+0200 ---> شيء مثل "+0700"

أحصل أيضًا على نفس الاختبار الفاشل رقم 28. المنطقة الزمنية الخاصة بي هي GMT -3.

وكيل:
Mozilla / 5.0 (Windows NT 6.1 ؛ WOW64) AppleWebKit / 535.11 (KHTML ، مثل Gecko) Chrome / 17.0.963.66 Safari / 535.11

الاختبار الفاشل: http://pastebin.com/dsWHMF3h

.:.

وكيل:
Mozilla / 5.0 (Windows NT 6.1؛ WOW64؛ rv: 10.0.2) Gecko / 20100101 Firefox / 10.0.2
أو
Mozilla / 5.0 (متوافق ، MSIE 9.0 ، Windows NT 6.1 ، WOW64 ، Trident / 5.0 ، SLCC2 ، .NET CLR 2.0.50727 ، .NET CLR 3.5.30729 ، .NET CLR 3.0.30729 ، Media Center PC 6.0 ، .NET4. 0C؛ Zune 4.7؛ .NET4.0E)

الاختبار الفاشل: http://pastebin.com/6t6JP9fu

يبدو أن هذا يحدث في UTC + 1 و UTC + 2 و UTC-3.

لسوء الحظ ، هناك طريقة الآن لإصلاح هذا. يعتمد ذلك على اختراق الناتج Date().toString() ، وإذا لم تتوفر معلومات المنطقة الزمنية في هذه السلسلة ، فلا توجد طريقة للحصول على هذه المعلومات.

سأقوم باستهلاك هذه الميزة وربما أقوم بعمل مكون إضافي يحتوي على نتائج أكثر موثوقية (على الرغم من أنها ربما تكون أقل دقة). ربما يجب أن يكون شيئًا مثل https://github.com/mde/timezone-js.

تم إيقاف عملات z zz المميزة اعتبارًا من 1.6.0. نتيجة لذلك ، أغلق هذه المشكلة.

ماذا عن node.js؟ هل z zz موثوق به أم لا في هذه البيئة؟

لقد تم إهمالهم رسميًا ، لذا لن يعملوا اعتبارًا من الإصدار 1.6.0.

بالنسبة لإصدارات الكود قبل ذلك ، أتخيل أن النتائج ستكون أيضًا غير متناسقة ، حيث تستخدم Node V8 وبعض النتائج غير المتسقة أعلاه موجودة في Chrome ، والذي يستخدم أيضًا V8.

شكر. لذلك بالنسبة لسلسلة مثل Thu Jan 10 2013 22:54:11 GMT+0100 (CET) ، ما انتهيت من فعله هو إزالة سلسلة المنطقة الزمنية باستخدام regexp (هنا (CET) مع المسافة البادئة) وترك معلومات تغيير الوقت فقط (هنا +0100 ). هل تعتقد أن هذا يكفي للحظة. js أم أنني أخاطر بعدم الاتساق؟

حسنًا ، لست متأكدًا مما تحاول فعله ، هل تحاول الحصول على CET أو +0100 ؟

+0100 عبر الرمز المميز ZZ (لاحظ الكتابة بالأحرف الكبيرة) ويعمل بشكل جيد عند التحليل والتنسيق.

تم إهمال CET لأننا لم نتمكن من الحصول عليها بشكل موثوق من Date.toString . ومع ذلك ، نظرًا لأننا نستخدم Date.getTimezoneOffset مقابل +0100 ، فإن الدعم أكثر ثباتًا.

أفعل كما تقول ، باستخدام ZZ لـ +0100 وإزالة CET من السلسلة للتحليل. هل له معنى ؟

اعتذاري ، ما زلت لا أفهم ما هي المشكلة هنا. هل تحاول تحليل Thu Jan 10 2013 22:54:11 GMT+0100 (CET) ؟ يجب أن تكون قادرًا على القيام بما يلي فقط.

moment('Thu Jan 10 2013 22:54:11 GMT+0100 (CET)', 'ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');

هذا بالضبط ما أفعله في النهاية. يبدو أنك تؤكد أنني أفعل الشيء الصحيح. اعتذاري إذا لم أكن واضحا أشكركم على الإجابات!

ليس هناك أى مشكلة!

@ hughanderson4 ، كانت المشكلة أن المتصفحات لا تعرض دائمًا اختصار المنطقة الزمنية من Date.prototype.toString . نظرًا لأننا لم نتمكن من الحصول على اختصار المنطقة الزمنية بشكل موثوق ، فقد تم إهماله.

ومنذ ذلك الحين، لحظة-التوقيت تم إنشاؤه لإضافة دعم الزمنية لmoment.js. قد ترغب في النظر في ذلك لمعرفة ما إذا كان يناسب احتياجاتك.

كيف يمكن للمرء تحويل Mom.utc () إلى التوقيت المحلي وعرض اختصار المنطقة الزمنية؟

سؤال غبي: لماذا مكتبة جديدة تمامًا؟ أليس الهدف من Moment هو حل جميع احتياجات التعامل مع التاريخ والوقت؟ بينما تضيف ملفات البيانات مقدارًا غير تافه من المساحة (ويمكنني أن أفهم فصلها) ، فإن المكتبة الجديدة نفسها أقل من 2 كيلو بايت ، لذلك لا يبدو أن المساحة سبب لفصلها.

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

أيضًا ، كيف يمكنني استخدام هذا الدمج الجديد للمكتبات لإنشاء سلسلة تاريخ بسيطة؟ قبل أن أتمكن من إنشاء:

Sun, 06 Nov 1994 08:49:37 GMT

مع:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

لكني الآن في حيرة من أمري فيما يتعلق بكيفية القيام بذلك بدون خيار التنسيق "z". سيكون موضع تقدير أي مساعدة.

لذا ، اسأل فقط للتأكد من فهمي: لا يوجد بديل للتنسيق "z" الذي تم إيقافه؟

إذا كان لدي طابع زمني بتنسيق ISO-8601 ، مثل:

2014-07-25T18:00:00-04:00

وأريد أن أعرض هذا الطابع الزمني على النحو التالي:

6:00 PM EST

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

هذا لا يشمل المنطقة الزمنية في الواقع. يمكن أن يكون هناك العديد من أسماء المناطق الزمنية التي تتوافق مع نفس إزاحة التوقيت العالمي المنسق (UTC) ، خاصة عند النظر في احتمالات تغيير التوقيت الصيفي. لا يمكنك الاستنتاج من "UTC-4: 00" أن المنطقة الزمنية هي EST.

للتوضيح ، لا يزال المنسق z يعمل عند استخدام المنطقة الزمنية اللحظية مع منطقة محددة - حيث يمكن سحب الاختصار من بيانات المنطقة الزمنية.

فقط أذكر هذا الآن - إذا كنت تستخدم
new Date().toTimeString()
تحصل على نفس النتيجة عبر جميع المتصفحات بقدر ما حاولت.

هذا يعني أنه يمكنك استخدام هذه السلسلة لاستخراج المنطقة الزمنية ، أليس كذلك؟

مرحبًا ، أرى أعلاه أن التنسيق ("z") مهمل. أيضًا في المستندات اللحظية ، أرى أنه قد تم إهماله من 1.6.0. أنا أستخدم 2.11.0 الآن ، يمكنني استخدام "z" لعرض المنطقة الزمنية (PST / PDT) على أساس الإزاحة.
هل يجب ألا أستخدم هذا الرمز "z" في الكود الخاص بي الآن؟ هل يمكنك معرفة البديل الدقيق لعرض توقيت المحيط الهادئ بدلاً من - / + 8

themakshter - لا ، لا تحصل على نفس النتيجة عبر جميع المتصفحات. يلعب نظام التشغيل وإصدار المتصفح واللغة دورًا كبيرًا في ذلك - ولا توجد متطلبات تناسق في المواصفات.

@ Shobana16 - إذا كنت تفعل moment().format('z') ، فستعود دائمًا "" .

إذا كنت تستخدم المنطقة الزمنية اللحظية ، وتقوم بشيء مثل moment.tz('America/Los_Angeles').format('z') ، فستحصل على إجابة صحيحة.

z مناسب للمنطقة الزمنية اللحظية. إنه لا يفعل شيئًا في لحظة بسيطة.

شكرا لك على التعليقات MJ. نعم أنا أستخدم "z" مع المنطقة الزمنية اللحظية فقط. حسنًا ، سيظل الرمز الخاص بي مع "z" رائعًا. !

مجرد ملاحظة لإضافتها ، اعتبارًا من المنطقة الزمنية 0.5.0 ، يمكنك _guess_ في المنطقة الزمنية المحلية ، مما يفتح الباب لـ:

var abbreviation = moment.tz(moment.tz.guess()).format('z');

هذا جيد ، لكن كن على علم بما يلي:

  1. إنه مجرد تخمين. قد يخمن خطأ.
  2. إذا كان التخمين خاطئًا ، فلا يزال هناك احتمال أن يكون الاختصار صحيحًا ، حيث أن العديد من المناطق الزمنية المتشابهة ستستخدم الاختصارات نفسها ، مثل كيف يستخدم كل من Europe/Paris و Europe/Berlin CET و CEST .
  3. ومع ذلك ، لا توجد ضمانات. إذا كانت التخمينات خاطئة ، فقد تقدم الاختصار الخاطئ.

قد نفكر أيضًا في تكييف moment.js بحيث إذا كانت المنطقة الزمنية اللحظية متاحة ، فيمكنها محاولة القيام بذلك تلقائيًا لإعادة تمكين المنسق z . على الرغم من أن هذا لا يحدث حاليًا.

var abbreviation = moment.tz(moment.tz.guess()).format('zz'); لا يعمل (مع z s). هل يمكنني فقط استرداد "EDT" وليس "Eastern Daylight Time"؟

شكر!

آه ، لقد وجدت أن http://momentjs.com/timezone/docs/#/using -timezones / formatting / says: لتقديم أسماء طويلة ، يمكنك تجاوز moment.fn.zoneName واستخدام zz رمز
[and much more...]
شكر.

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

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

أعتقد أن المشكلة هي الموثوقية. لا يمكن لـ Moment استخراج المنطقة الزمنية الصحيحة من كائن التاريخ المحلي بشكل موثوق ، لذا لم تعد تدعم z/zz في تنسيقها.

تمت مناقشته أعلاه:
https://github.com/moment/moment/issues/162#issuecomment -4060027

هذا ما نجحنا في الحصول على نص "GMT" نظرًا لأنه تم إيقاف العمل بـ z

const dateGenerated = moment("2020-05-20 08:15:25");
const localDateGenerated = dateGenerated.local().format('DD MMM YYYY hh:mm A') + ' ' + String(dateGenerated.local()._d).split(' ')[5];

سيولد 20 May 2020 08:15 AM GMT+0300"

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات