<p>يوزع Mom.utc (سلسلة) ISO8601 كتوقيت محلي عندما تكون المنطقة الزمنية مفقودة</p>

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

انظر هذا التعليق: https://github.com/timrwood/moment/issues/272#issuecomment -5095486

Bug

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

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

ال 24 كومينتر

يوزع Mom.utc (سلسلة) ISO8601 كتوقيت محلي عندما تكون المنطقة الزمنية مفقودة

هكذا تقول ISO8601 ... و EcmaScript 6

أعتقد أن هذا ينطبق على moment(string) جيدًا ، ولكن عند استخدام moment.utc(string) ، أعتقد أن المعنى الضمني هو أنك تريد تحليله على أنه UTC.

moment('2010-10-20T08:40'); // should parse to local time
moment.utc('2010-10-20T08:40'); // should parse to utc time

لدي مشكلة ، أعتقد أنها مرتبطة بهذا:

أحاول تحويل هذا التاريخ: 12-04-2012 (DD-MM-YYYY ، بالتوقيت العالمي المنسق) إلى طابعه الزمني في نظام Unix.
أنا أقوم بفعل هذا:

var date = '12-04-2012';
var mm = moment().utc( date, "DD-MM-YYYY" );
console.log( mm.valueOf() );

ينتج عن هذا طابع زمني غير صحيح: 1334670827391 .
إذا حاولت:

console.log( mm.format('DD-MM-YYYY') );

الناتج: 17-04-2012

a538306 يعمل على إصلاح هذا. سيخرج في 1.6.0

ما زلت أرى هذه المشكلة في أحدث إصدار ..

مرر في: moment.utc ('2012-12-14T00: 29: 40.276Z') وأحصل على: {_d: الخميس 13 ديسمبر 2012 18:29:40 GMT-0600 (التوقيت المركزي القياسي) ، _isUTC: صحيح (الخميس 13 ديسمبر 2012 18:29:40 GMT-0600 (التوقيت المركزي المركزي)) .. إنه لا يستخدم التوقيت ولكن التوقيت المحلي الخاص بي.

هذا ما أحصل عليه بـ 1.7.2 .

moment.utc('2012-12-14T00:29:40.276Z').format(); // "2012-12-14T00:29:40+00:00"

هذا ما يحدث لي (أحدث إصدار) عندما أكتب إلى وحدة التحكم في الكروم:

console.log (moment.utc ('2012-12-14T00: 29: 40.276Z')) ؛
console.log (moment.utc ('2012-12-14T00: 29: 40.276Z'). format ()) ؛
console.log (moment.utc ('2012-12-14T00: 29: 40.276Z'). toDate ()) ؛

H {_d: الخميس 13 كانون الأول (ديسمبر) 2012 18:29:40 GMT-0600 (التوقيت الرسمي المركزي) ، _isUTC: صحيح ، _a: Array [8] ، _lang: false ، clone: ​​function…}

2012-12-14 T00: 29: 40 + 00: 00

الخميس 13 ديسمبر 2012 18:29:40 GMT-0600 (التوقيت المركزي المركزي)

ألا يجب أن يتم إنشاء تاريخ جديد في UTC (بدون منطقة زمنية)؟ يعرض أيضًا أول وحدة تحكم console.log كائن اللحظة بمنطقة زمنية cst وليس وقت utc.

Thu Dec 13 2012 18:29:40 GMT-0600 هو في الواقع نفس الوقت تمامًا مثل 2012-12-14T00:29:40.276Z . إنها مجرد طرق مختلفة لعرض نفس الوقت. إذا كنت تريد ، يمكنك رؤية ذلك عن طريق القيام بما يلي.

console.log(moment.utc('2012-12-14T00:29:40.276Z').toDate().toString());
// Thu Dec 13 2012 16:29:40 GMT-0800 (PST)
console.log(moment.utc('2012-12-14T00:29:40.276Z').toDate().toUTCString());
// Fri, 14 Dec 2012 00:29:40 GMT

لا يحتوي JS Date الأصلي على وضع utc مقابل الوضع المحلي ، فهو يحتوي فقط على موصّل مثل getUTCHours و getHours .

يلخص Moment.js هذه الأساليب getUTC* مقابل get* مع فكرة وضع utc والوضع المحلي. إذا كانت اللحظة في وضع utc ، فإنها تستخدم طرق getUTC* . إذا كان في الوضع المحلي ، فإنه يستخدم طرق get* .

شكرا على التوضيح.

كنت أتوقع وأعتقد أن sinze ينص معيار iso على أن Z لا تعني أي منطقة زمنية ستفترض أن utc. لذلك ، إذا قمت بعمل moment.utc ('2012-12-14T00: 29: 40.276Z') أو لحظة ('2012-12-14T00: 29: 40.276Z') ، فسيتم التعامل مع كلاهما كـ utc وستكون علامة utc ضبط على صواب.

ملاحظة ، آسف لإزعاجك كثيرًا:. أقوم بإنشاء مناقشة جديدة لسؤال مختلف: s

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

سبب عدم تعيين علامة isUTC مع كلٍّ من moment() و moment.utc() هو أنه على الرغم من أنك قد تقوم بتحليل سلسلة UTC + 0 ، فقد ترغب في عرض لحظة في المنطقة الزمنية للمستخدمين.

هذه حالة استخدام شائعة جدًا ، حيث إنها ممارسة جيدة لتخزين الأوقات مثل سلاسل ISO8601 UTC + 0 على الواجهة الخلفية وعرضها على الواجهة الأمامية في المنطقة الزمنية للمستخدم.

شكرًا ، أتمنى أن يجد شخص آخر هذه المناقشة مفيدة أيضًا.

عندما أقوم بتشغيل console.log (moment.utc ()) ، فإنه يُبلغ "الجمعة 18 يناير 2013 16:25:32 GMT-0800 (UTC)" ومع ذلك ، هذا هو التوقيت المحلي للمحيط الهادئ ، وليس التوقيت العالمي المنسق (UTC) الحالي. نظرًا لأنه يشير بوضوح إلى (UTC) عندما أقوم بتسجيله ، أفترض أنه يعتقد أن "16:25:32" هو بتوقيت UTC ، لكنه بالفعل وقت المحيط الهادئ المحلي ...

بالإضافة إلى ذلك ، أفترض أن moment.utc (). valueOf () تعيد عدد المللي ثانية بالتوقيت العالمي المنسق منذ العصر ، والذي يبدو غير صحيح. هل رأيت أيًا من هذا السلوك؟

console.log (لحظة ())
H {_d: الجمعة 18 كانون الثاني (يناير) 2013 16:51:20 GMT-0800 (UTC) ، _isUTC: false ، _a: null ، _lang: false}
console.log (moment.utc ())
H {_d: الجمعة 18 كانون الثاني (يناير) 2013 16:51:20 GMT-0800 (UTC) ، _isUTC: صحيح ، _a: فارغ ، _lang: false}

يبدو أن كل ما يفعله هو قلب علامة _isUTC. : P يبدو أنه يعود بالتوقيت المحلي بغض النظر عما إذا كنت أحدد .utc () أم لا.

نعم ، .utc و .local فقط اقلب علامة .isUTC التي تُستخدم في جميع أدوات التسجيل.

نظرًا لأنه يتم عرض Date.toString الأصلي بالتوقيت المحلي ، فإنك ترى نفس التمثيل في كلتا الحالتين.

ومع ذلك، .format يستخدم .isUTC العلم، لذلك تهيئة لحظة مع isUTC العلم مجموعة إلى تنسيق الإرادة الحقيقية كما هو متوقع.

راجع الاختلافات أدناه بخصوص Date.prototype.toString و Date.prototype.toUTCString و moment.fn.format .

moment().toDate().toString();     // "Wed Jan 23 2013 09:48:54 GMT-0800 (PST)"
moment.utc().toDate().toString(); // "Wed Jan 23 2013 09:48:54 GMT-0800 (PST)"
moment().toDate().toUTCString();     // "Wed, 23 Jan 2013 17:48:54 GMT"
moment.utc().toDate().toUTCString(); // "Wed, 23 Jan 2013 17:48:54 GMT"
moment().format();     // "2013-01-23T09:48:54-08:00"
moment.utc().format(); // "2013-01-23T17:48:54+00:00"

نفس المشكلة هنا:
اللحظة (). valueOf () واللحظة (). utc (). valueOf ()
إرجاع نفس القيمة! :خائب الامل:

لذا ، لأحصل على جزء من الثانية ، أحتاج إلى:

moment().valueOf() - (moment().utcOffset() * 60 * 1000)

rubenspgcavalcante - لست متأكدًا مما تطلبه. هذان النوعان _ يُفرض عليهما_ إرجاع نفس القيمة ، وكلاهما بالملي ثانية منذ حقبة يونيكس.

يعود المقتطف الذي كتبته في الواقع لحظة مختلفة في الوقت المناسب.

أواجه مشكلة مماثلة حيث تم تعيين علامة UTC على "صحيح" ولكن عند تنسيق "كال" () ؛ تقوم بإرجاع التوقيت المحلي. هنا هي لقطة الشاشة.

screen shot 2016-07-10 at 8 50 15 am

السطر بعد الكائن هو console.log من var بعد أن أدعو format () ؛ عليه.

أفعل شيئا خاطئا؟

@ james-hoegerl يبدو أن كائن التاريخ الداخلي هو 5 يوليو 2016 الساعة 19:00 بالتوقيت المركزي. أضف خمس ساعات إلى ذلك للوصول إلى التوقيت العالمي المنسق (UTC) ، وهو 6 يوليو ، وهو ما يبدو أنه قيد التسجيل ، لذلك باختصار ، لا أرى أي خطأ.
يبدو أنك تستخدم التقويم الكامل. إنه يقوم ببعض التمديد / التصحيح اللحظي الذي قد يتسبب في سلوك غير عادي.

حسنًا ، ربما أكون في حيرة من أمري. اعتقدت أنني سأحصل على "2016-05-07 07:00:00" ثم يمكنني تخزين ذلك في DB ثم الحصول على التوقيت المحلي لكل كمبيوتر مستخدم نهائي عبر لحظة.

لذا ، أولاً وقبل كل شيء سأفترض أنك كنت تقصد 6016-07-05 (5 يوليو ، وليس 7 مايو). التوقيت المحلي الخاص بك هو الخامس من تموز (يوليو) الساعة 19:00. تم تعديله ليناسب ضوء النهار المركزي الأمريكي ، نضيف خمس ساعات. ينتج 6 يوليو في منتصف الليل.

إذا كنت تقصد الحصول على الخامس من يوليو ، فأعتقد أن ما تريده بالفعل هو التوقيت المحلي ، وليس التوقيت العالمي المنسق. يمكنك الاتصال بـ .local () في الوقت الحالي لإعادته إلى التوقيت المحلي.

قد تجد هذا مفيدًا: https://maggiepint.com/2016/05/14/moment-js-shows-the-wrong-date/

شكرًا جزيلاً على مساعدتكmaggiepint. نعم تعليقي السابق كان يعني 7-5. آسف لأنني كتبت هذا التعليق على عجل على هاتفي بجوار حمام السباحة في نهاية هذا الأسبوع. أرى أين كان تفكيري متخلفًا الآن. يعمل fullcalendar على جميع كائنات اللحظات الغامضة المخصصة للوقت ، لذا أعتقد أنني كنت أعاني من بعض سوء الفهم هناك وأحتاج إلى القيام ببعض التهدئة في ذلك. شكرا مرة أخرى على وقتك maggiepint

مرحبًا ، لتحويل UTC إلى وقت المستخدم ، هل نحتاج إلى توفير التنسيق.
على سبيل المثال: let utcTime = moment ({hour: 10، minutes: 20) .format ('YYYY-MM-DD HH: mm: ss')؛
اسمحوا stillUtc = moment.utc (utcTime) .toDate () ؛
دع localTime = moment (stillUtc) .local () ؛
الآن يمكنني الحصول على localTIme. ولكن إذا قمت بإزالة التنسيق ، فلا يزال بإمكاني تنسيق UTC. هنا 10:20 هو التوقيت العالمي المنسق (UTC) الذي يأتي من الخلفية. أريد أن أظهر هذا للمستخدم في المنطقة الزمنية للمستخدم.

ساعدني من فضلك.

نفس المشكلة هنا:
اللحظة (). valueOf () واللحظة (). utc (). valueOf ()
إرجاع نفس القيمة! 😞
لذا ، لأحصل على جزء من الثانية ، أحتاج إلى:
لحظة (). valueOf () - (لحظة (). utcOffset () * 60 * 1000)

rubenspgcavalcante - لست متأكدًا مما تطلبه. من المفترض أن يعيد هذان العنصران نفس القيمة ، وكلاهما بالمللي ثانية منذ عهد يونكس.

@ mj1856 لا أفهم كيف من المفترض أن تُرجع الدالة (). valueOf () و moment (). utc (). valueOf () نفس القيمة ؟؟

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

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