Moment: تنسيق المدة

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

لقد تطرقنا إلى هذا من قبل في # 463 و # 879 لكننا لم نتحدث عنه مطلقًا بشكل مباشر في مشكلته الخاصة.

نحتاج إلى طريقة لتنسيق المدد تشبه طريقة تنسيق التواريخ. يجب أن تكون بسيطة مثل:

moment.duration(x).format("H:mm:ss")

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

  • يعني hh "الساعات المتبقية بعد احتساب الأيام"
  • h سيكون الصيغة المكونة من رقم واحد hh
  • يعني HH "إجمالي الساعات الكاملة"
  • H سيكون الصيغة المكونة من رقم واحد HH
  • يعني HHH "إجمالي الساعات بما في ذلك الكسور العشرية" - على الرغم من أنه يمكن القيام بذلك حاليًا باستخدام duration.asHours() ، لذلك قد لا يكون هذا ضروريًا.

سيتم تطبيق تنسيق مماثل للوحدات الأخرى. في هذا السياق ، ستكون أعلى وحدة هي "اليوم" ، والتي ستكون يومًا قياسيًا يتكون من 24 ساعة قياسية. لن يكون من المنطقي قياس السنوات أو الأشهر بهذا بسبب مشاكل التقويم.

لاحظ أن هذا ظهر مؤخرًا (مرة أخرى) على StackOverflow في هذا السؤال . كان المستخدم يبحث عن شيء مثل duration.format("H:mm:ss") . هذا هو الحل:

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

هذا يعمل ، لكنه يشعر بأنه مبتذل. يجب أن يتم بناء هذا.

New Feature Up-For-Grabs

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

أليس من الأفضل أن تفعل

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

بدلا من

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

ال 118 كومينتر

+1

كان moment.duration(x).format("H:mm:ss") بالضبط ما كنت أتوقعه ، قبل أن أفهم أنه لن ينجح. الحل البديل الذي اقترحه مات يعمل بشكل جيد ولكن بالمقارنة مع أناقة الأشياء الأخرى في Momjs فمن المؤكد أنه يبدو مبتذلاً.

أليس من الأفضل أن تفعل

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

بدلا من

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Code Bounty

RobinvdVleuten - تكمن مشكلة استخدام HH في التنسيق الحالي في أنها تمثل الساعة _portion_ من التاريخ والوقت الكاملين. عند التعامل مع الوقت المنقضي ، يمكن أن يكون هناك 24 ساعة أو أكثر. حاول تمرير 24 ساعة ، وسترى أنه تتم إعادة تعيينها إلى الصفر.

لقد لاحظت ذلك بالفعل. أنا الآن أستخدم المللي ثانية المحسوبة لتنسيقه ، لكنه لا يزال حلًا بديلًا.

هل تعتقد أنه سيكون هناك "مستوى" واحد من الباقي ممكن - على سبيل المثال ، لا توجد طريقة لقول "ساعات بعد المحاسبة لشهور"؟ أعتقد أن هذا حد معقول تمامًا ، ولكن فقط للتعبير عن الكلام ، يمكنني أن أتخيل تقديم حجة "مرساة" ، مثل:

moment.duration(x).format("hh:mm:ss", "M");

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

moment.duration(x).format("hh:ss");

... الثواني ستكون modulo للساعات.

ربما لا تكون هذه فكرة رائعة - لم يتم تسويتها (إلى أين تذهب الأسابيع في هذا التسلسل الهرمي؟) وربما تكون غير ضرورية (من غير المرجح أن يرغب الناس في مثل هذه الثغرات). لكن من الممتع التفكير فيها.

في ملاحظة أكثر جدية ، كيف ستتعامل مع الشهر مقابل الدقائق باستخدام تدوين الأحرف الصغيرة / الكبيرة؟

كنت أتخيل أن الأيام ستكون الحد الأقصى لحجم الوحدة ، لذلك لن تدخل الأشهر في الصورة. في الأساس ، هذا هو معكوس كيفية تحليل المدد القادمة من فترات asp.net الزمنية.

من المنطقي.

لقد قرأت مستند SCORM 2004 RTE (p77) ، ووجدت أنه بالنسبة لتمثيل الفاصل الزمني على النحو التالي ، أعتقد أن هذا جاء من معيار ،

من الناحية النظرية يمكنني تمرير قيمة مثل: P34H
ويجب على المحللون تفسير ذلك على أنه يوم واحد و 10 ساعات

آمل أن يكون من الممكن تنسيق الإخراج مع وضع ذلك في الاعتبار
مثل "PHM"
ويفسر المنسق ذلك على أنه إجمالي الساعات المتبقية من الدقائق؟
أود أن أكون قادرًا على تنسيق الإخراج مثل HH: MM

آمل أن تكون هذه المعلومات مفيدة

الفاصل الزمني (الثاني ، 10 ، 2): يشير الفاصل الزمني (الثاني ، 10 ، 2) إلى أن قيمة
يمثل الفاصل الزمني لعنصر نموذج البيانات الوقت المنقضي بدقة 0.01
ثواني [1]. يحدد الربط النقطي لـ SCORM تنسيقًا معينًا لملف
سلسلة الأحرف لتمثيل فترة زمنية.
يجب أن يكون تنسيق سلسلة الأحرف كما يلي:
P [yY] [mM] [dD] [T [hH] [nM] [s [.s] S]] حيث:
• y: عدد السنوات (عدد صحيح ،> = 0 ، غير مقيد)
• م: عدد الأشهر (عدد صحيح ،> = 0 ، غير مقيد)
• د: عدد الأيام (عدد صحيح ،> = 0 ، غير مقيد)
• h: عدد الساعات (عدد صحيح ،> = 0 ، غير مقيد)
• n: عدد الدقائق (عدد صحيح ،> = 0 ، غير مقيد)
• s: عدد الثواني أو جزء الثواني (حقيقي أو عدد صحيح ،> = 0 ، لا
مقيد). إذا تم استخدام كسور من الثانية ، يقوم SCORM بتقييد السلسلة إلى
حد أقصى من رقمين (على سبيل المثال ، 34.45 - صالح ، 34.45454545 - غير صالح).
• تظهر العلامات الحرفية للحرف P ، Y ، M ، D ، T ، H ، Mand إذا كانت
القيمة المقابلة غير الصفرية موجودة.
• يجب دعم الحشو الصفري للقيم. لا يغير الحشو الصفري ملف
القيمة الصحيحة للرقم الذي يتم تمثيله بواسطة مجموعة من الأحرف. ل
على سبيل المثال ، PT05H يكافئ PT5H و PT000005H.
مثال:
• تشير P1Y3M2DT3H إلى فترة زمنية مدتها سنة واحدة و 3 أشهر ويومان و 3 ساعات
• يشير PT3H5M إلى فترة زمنية تبلغ 3 ساعات و 5 دقائق

يجب على المنفذين أن يدركوا أن التنسيق والتجليد مخصصان لتوصيل
البيانات بين SCO و LMS. نظرًا لأن التنسيق يمثل فترة زمنية ،
ثم مدة مثل PT5M تعادل PT300S.
إذا كان عنصر نموذج البيانات ، من النوع الفاصل الزمني (الثاني ، 10،2) يحتوي على قيمة ، إذن
• يجب أن يكون المحدد حاضرًا.
• إذا كانت قيمة السنوات أو الأشهر أو الأيام أو الساعات أو الدقائق أو الثواني تساوي صفرًا ، القيمة
وقد يتم حذف التعيين الحرفي للحرف المقابل ، ولكن واحدًا على الأقل
يجب أن يكون التخصيص الحرفي للشخصية والقيمة موجودًا بالإضافة إلى التسمية
ص ؛
• يحذف التعيين إذا كانت جميع مكونات الوقت (ساعات ، دقائق
والثواني) لا تستخدم. يمكن استخدام قيمة صفرية مع أي وقت
المكونات (على سبيل المثال ، PT0S).

سيكون تنسيق المدة إضافة ممتازة. ليست هناك حاجة إلى رمزين مميزين "للساعة". افترض أن المدة 32 ساعة. لن ترغب أبدًا في الاستخراج لمدة 8 ساعات فقط دون أن تستغرق يومًا واحدًا.

أعتقد أن لدى icambron اقتراح جيد. قم بتحليل سلسلة التنسيق إلى رموز مميزة وعبر عن المدة من حيث الوحدة الأكبر. قم بتحليل الرموز المميزة واحدة تلو الأخرى بالترتيب (على سبيل المثال ، "DD: hh: ss" تعني عدد الأيام الكاملة ، وعدد الساعات الكاملة بعد احتساب الأيام ، وعدد الثواني الكاملة بعد احتساب الأيام + الساعات).

لقد قمت بنشر المكون الإضافي للحظة. duration.format:
https://github.com/jsmreese/moment-duration-format

أعتقد أنه يعالج معظم الأفكار / حالات الاستخدام في هذا الموضوع.

jsmreese هل فكرت في تقديم طلب سحب يحتوي على المكون الإضافي الخاص بك كجزء أساسي من Momjs؟

hotzenklotz نعم لقد فكرت في تقديم طلب سحب.

لم أفعل ذلك بسبب جميع الأسباب icambron الموضحة في # 1538.

المكون الإضافي الخاص بي:

  • يعتمد على Lo-Dash
  • لا يبدو وكأنه رمز Moment.js
  • يستخدم إعداد اختبار مختلف تمامًا

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

نريد أيضًا التأكد من إمكانية تدويل الكود. لحسن الحظ ، فإن معظم السلاسل التي سنحتاجها موجودة في Unicode CLDR ، لذا فإن القليل جدًا من أعمال الترجمة ستكون ضرورية.

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

يحتوي CLDR أيضًا على معلومات حول كيفية عرض فترات زمنية محددة (بدلاً من المدد) والتي قد تكون مفيدة في مرحلة ما ...

بيانات التقويم الإنجليزية (الولايات المتحدة)

نشرت للتو إصدارًا جديدًا من تنسيق Moment Duration الذي يزيل التبعية السابقة على Lo-Dash أو Underscore.

https://github.com/jsmreese/moment-duration-format

jsmreese يناسب احتياجاتنا تماما. شكرا!

+1

+1

+1

+1

+1

+1

+1

+1

ربما أبدو كسجل مكسور في هذه المشكلة ، لكني أود التأكد من أن أي حل يتبع الاتفاقيات الحالية حيثما أمكن ذلك ، ويمكن تدويله بسهولة (والذي يتضمن إضافة رموز مشابهة لـ LLLL لتنسيقات المدة شائعة الاستخدام .

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

يبدو بناء الجملة hh / h الموصوف أعلاه بمثابة خروج كبير عن رموز التنسيق المميزة المستخدمة من قبل ISO8601 و CLDR و Apache ، وأنا أفضل تجنبه إذا كان ذلك ممكنًا.

قد يكون الاقتراح الأفضل هو الاستدلال على استخدام الوحدة الأكثر أهمية في نمط التنسيق مثل modulo ، لذلك سيعرض h:mm:ss وقتًا "عاديًا" ، لكن عد الساعات بعد 24 (على سبيل المثال 26:30:00). ليس من الواضح كيف يمكن للمرء حتى حساب نمط مثل "HH:MM:ss" ، أو ما هي حالة الاستخدام لذلك. السماح للمطورين بتجاوز هذا السلوك يبدو أيضًا أنه يمكن أن يصبح بسهولة مصدرًا للأخطاء.

التزامًا بروح "i18n في كل مكان" ، تحدد CLDR تنسيقات المدة لـ:

  • الساعات + الدقائق ( h:mm في EN-US)
  • ساعات + دقائق + ثانية ( h:mm:ss في EN-US)
  • الدقائق + الثواني ( m:ss في EN-US)
    وقد يكون من المنطقي تقديم ثوابت خاصة بالإعدادات المحلية (على غرار تنسيقات التاريخ LLL ) لهذه الفترات الزمنية.

لسوء الحظ ، يصعب حقًا التعبير عن مدد التنسيق بوحدات أكبر من ساعات عبر سلسلة تنسيق واحدة (بفضل قواعد الجمع التي تحتاج إلى أخذها في الاعتبار) ، ولم أتمكن من العثور على أي مكتبة بأي لغة تسمح بذلك تنسيق سهل وصديق لـ i18n لفترات تزيد عن 24 ساعة. أفضل ما يمكنك فعله هو توسيع duration.humanize() لأخذ بعض المعلمات الإضافية ، وتنفيذ الاقتراح الأصلي بشكل فعال في # 463.

باختصار ، قد لا يكون تطبيق duration.format() فكرة جيدة ، حيث أرى أن أي حل محتمل ينطوي على عيوب كبيرة. سيكون أفضل رهان لك هو تحسين duration.humanize() ، أو تنفيذ مصغر duration.format() لا يفهم سوى الساعات والدقائق والثواني.

+1

في حال احتجت إلى وظيفة سريعة لإضافة الحشو:

function padWithZero(input, length) {
    // Cast input to string
    input = "" + input;

    let paddingSize = Math.max(0, length - input.length);
    return new Array(paddingSize > 0 ? paddingSize + 1 : 0).join("0") + input;
}

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

: +1:

: +1: اللحظة المفاجئة لا تفعل هذا ، عادة لا تخذلني أبدًا!

+1 لقد استخدمت تنسيق الوقت-المدة المشار إليه أعلاه ، لكنه غير دولي. أحاول إخراج أيام ومن المحتمل أن أحتاج إلى شهور أيضًا ، والتي تحتاج حقًا إلى تسميات.

هل هناك أي تقدم في هذه القضية؟

+1

+1

+1

+1

: +1:

+1
لماذا لا يزال غير موجود في الصميم؟

+1 +1 +1 +1 +1

+1

+2

jsmreese هل يدعم البرنامج المساعد الخاص بك i18n؟

rumeshwick : ربما؟ هذا يعتمد حقًا على كيفية قيامك بـ i18n وما تتوقعه من المكون الإضافي الخاص بي.

+1

اكتشفت أنه من الممكن بهذا النوع من الاختراق:

  var dur = moment.duration('PT90M');
  moment(dur._data).format('[it\'s] D [days and] h [hour]');

هذه العوائد:

"إنه يوم واحد وساعة واحدة"

ومع ذلك ، لا يمكنك طباعة شيء مثل "إنها يوم واحد و 90 دقيقة".
لأغراضي هذا يكفي.
لا يشمل i18n ولكن في حالتي لا أريد حل هذه المشكلة لحظة. js.

مرحبًا ، لديك مساعد Ember.JS هنا من أجل هذا:

https://github.com/ember-building-blocks/ember-hbs-date-helpers

+1

+1 للطريقة المخترقة لـ @ vanthome : +1:

jsmreese - هل أنت مهتم بدمج المكون الإضافي الخاص بك في Moment core؟ سيكون مفيدًا جدًا ومقدرًا جدًا.

ستحتاج إلى إعادة تنسيقها لتلائم تنفيذ ES6 الجديد ، واستبدال بعض الوظائف الزائدة عن الحاجة بمكافئ اللحظة ، لكن بشكل عام أعتقد أنه سيكون سهلًا إلى حد ما.

@ mj1856 مهتم بالتأكيد. سأتواصل معك عبر البريد الإلكتروني مع بعض الأسئلة.

ياي! طريقة للذهاب ، jsmreese و @ mj1856 !!! :التصفيق التصفيق التصفيق:

لقد جئت إلى هنا فقط لاقتراح دمج المكون الإضافي jsmreese في لحظة js.

+1

+1

نظرًا لأنه يبدو أن jsmreese قصير في الوقت المحدد ، فأنا أضع علامة على هذا على أنه Up For Grabs. بشكل أساسي ، يجب أن تنفذ العلاقات العامة المقترحة جميع وظائف المكوّن الإضافي jsmreese ، ولكن يجب أن تتوافق مع نمط ES2015 المستخدم الآن في moment.js ، ويجب إعادة استخدام أكبر قدر من الوقت الحالي. شبيبة لتقليل حجم التعليمات البرمجية.

+1

إحدى الميزات التي يفتقر إليها البرنامج المساعد jsmreese لتنسيق الوقت والمدة ، هي القدرة على إعادة إنشاء كائن مدة من السلسلة المنسقة.

مرحبًا @ mj1856 ، أنا مهتم بمعالجة دمج المكون الإضافي للتنسيق في اللحظة. كيف تعمل المساهمة هنا مع التسمية Up-For-Grabs ، هل يجب أن أعمل عليها فقط وأرسل PR إلى الفرع develop ، أم أن شخصًا آخر طالب به؟

joshrowley لم تتم المطالبة به ، لكنك ستكون بطلاً إذا قمت بذلك. انطلق وخذها ، وعندما تكون جاهزًا أرسل سحبًا. سيكون هذا الأمر أكثر تعقيدًا من غيره ، لذلك إذا كنت ترغب في ذلك ، فلا تتردد في إرسال طلب سحب للمراجعة قبل الانتهاء - سنراقب ذلك. سنكون من الصعب إرضاء عدم تفجير حجم المكتبة بهذه المكتبة - إنها بالفعل أكبر مما نود. من فضلك كن على علم بذلك.

ربما سأتعامل مع هذا أيضًا (أو بدلاً من ذلك) ، لكنني بحاجة أولاً إلى التوافق مع بنية التطوير الكاملة.

جاري العمل PR: # 3308

مرحبًا يا رفاق ، لقد فتحت العلاقات العامة على رقم 3615 وأحب بعض العيون عليها!

ربما يكون هذا مرتبطًا - المشكلات التي تمت مواجهتها:
moment.duration (3500000) .format ("hh: mm"، {forceLength: true})
الذي يعرض النتيجة: 58 ، بدلاً من 00:58

http://stackoverflow.com/questions/41443233/using-moment-js-to-display-duration-in-format-00xx-when-duration-is-less-than-a

ms = moment(moment().format(),"YYYY-MM-DD HH:mm:ss").diff(moment(time,"YYYY-MM-DD HH:mm:ss"));
var duration = moment.duration(ms);
moment(duration._data).format("HH:mm");

اختراق آخر لتنسيق المدد ....

var timeInSeconds = 5000;
var formattedDur = moment("1900-01-01 00:00:00").add(timeInSeconds, 'seconds').format("HH:mm:ss");

+1

لاحظ أن الاختراق الذي نشره fabiogalera و befreestudios يبدو أنه يعمل بشكل جيد لفترات أقل من 24 ساعة ، ولكن لا يعمل أي منهما لفترات تزيد عن 24 ساعة.

تحرير: يبدو أن هذا يرجع إلى كونك على نسخة قديمة من اللحظة. لقد جربته مرة أخرى مع أحدث إصدار وهو يعمل كما هو متوقع. اسف لخلط الامور.
-
لقد وجدت أيضًا بعض أخطاء التقريب / حالات الحواف الغريبة مع الاختراق الأصلي المنشور بواسطة @ mj1856 في الجزء العلوي من هذا الموضوع. على سبيل المثال ، جرب 2.3 أو 4.1 ساعة. هذه قيم عشرية يجب أن تقسم بالتساوي إلى عدد من الدقائق.

على سبيل المثال ، يجب أن تكون القيمة 2.3 هي 2:18:00 بالضبط ولكن ستحصل على 2:17:59. و 4.1 يجب أن تكون بالضبط 4:06:00 ، لكنك ستحصل على 4:05:59. يبدو أن هذا يرجع إلى وجود بعض مشكلات الدقة / التقريب في الأساليب duration.asXXX() . هل رأى أي شخص آخر هذا ولديه أي اقتراحات؟

ها هي funtion الخاص بي من أجل duration.format بناءً على Date.format (https://gist.github.com/ptquang86/2893903)

moment.duration.fn.format = moment.duration.fn.format || function (mask): string {
            // Some common format strings
            let formatMasks = {
                "default":      "DD MM YYYY HH:mm:ss",
                shortDate:      "M/D/YY",
                mediumDate:     "MM DD, YYYY",
                longDate:       "MM DD, YYYY",
                fullDate:       "DD, MM, YYYY",
                shortTime:      "H:mm TT",
                mediumTime:     "H:mm:ss TT",
                longTime:       "H:mm:ss TT Z",
                isoDate:        "YYYY-MM-DD",
                isoTime:        "hh:mm:ss",
                isoDateTime:    "YYYY-MM-DD'T'hh:mm:ss",
            };

            let format = function () {
                let token = /D{1,2}|M{1,2}|YY(?:YY)?|([HhmsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g;

                function pad(val, len?) {
                    val = String(val);
                    len = len || 2;
                    while (val.length < len) val = "0" + val;
                    return val;
                }

                // Regexes and supporting functions are cached through closure
                return function (date, mask) {
                    mask = String(formatMasks[mask] || mask || formatMasks["default"]);

                    let D = date.days(),
                        m = date.months(),
                        y = date.years(),
                        H = date.hours(),
                        M = date.minutes(),
                        s = date.seconds(),
                        L = date.milliseconds(),
                        flags = {
                            D:    D,
                            DD:   pad(D),
                            M:    m + 1,
                            MM:   pad(m + 1),
                            YY:   String(y).slice(2),
                            YYYY: y,
                            H:    H % 12 || 12,
                            HH:   pad(H % 12 || 12),
                            h:    H,
                            hh:   pad(H),
                            m:    M,
                            mm:   pad(M),
                            s:    s,
                            ss:   pad(s),
                            l:    pad(L, 3),
                            L:    pad(L > 99 ? Math.round(L / 10) : L),
                            t:    H < 12 ? "a"  : "p",
                            tt:   H < 12 ? "am" : "pm",
                            T:    H < 12 ? "A"  : "P",
                            TT:   H < 12 ? "AM" : "PM",
                        };

                    return mask.replace(token, function ($0) {
                        return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
                    });
                };
            }();

            return format(this, mask);
        };

use: moment.duration (10000) .format ("hh: mm: ss: l")

+1

أي أخبار هنا ، لحظة الحصول على هذه الوظيفة؟ ما هو الإجماع؟

+1

الارتطام مرة أخرى يشبه المشروع الرابع حيث أردت استخدام مثل هذه الوظيفة. آمل أن أراه مطبقًا في moment.js قريبًا جدًا.

+1

لقد كنت أراقب هذا لفترة طويلة على أمل أن يتم تنفيذ هذه الميزة. هل هناك أي عمل جار على هذا؟

بقدر ما أعلم أنه يعمل الآن ، لديّ في تطبيقي ، تحقق من المستندات:
https://momentjs.com/docs/#/durations/

@ luchillo17 هل تتحدث عن مدد العمل بشكل عام؟

حسنًا ، لقد حاولت للتو 5 دقائق وكانت تعمل.

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

سيئتي ، الخيط كبير لدرجة أنني ضاعت في الطريق.

ولكن الآن بعد أن نظرت عن كثب ، هناك مكون إضافي لتنسيق مدة اللحظة مدرج في المستندات:
https://momentjs.com/docs/#/plugins/duration -format /

هل هذا ما تأمله يا رفاق؟ يبدو أنه يحتوي حتى على تعريفات لنوع TypeScript.

وقد اختبرت ذلك ، يعمل بشكل جيد.

البرنامج المساعد يعمل بشكل جيد جدا. أحب أن أراها مدمجة في Moment.js. لا أستطيع أن أرى كيف تكون المدد مفيدة بدونها.

إنه مكون إضافي لأنه لا يستخدم جميع الأشخاص المدة ، ولا أرى أن الكثير من قاعدة المستخدمين تحتاج إلى فترات لتبرير جعل قاعدة الشفرة أكبر.

أنا حتى مندهش من أن وحدة المدة بأكملها ليست في مكون إضافي.

أو ذاك. في الوقت الحالي ، وحدة المدة لا طائل من ورائها. جميع الوظائف الموجودة فيه هي مجرد رياضيات بسيطة يمكن إجراؤها بشكل جيد بدون مكتبة.
إذا تم دمج المكون الإضافي ، فيمكنني أن أرى أنه يستخدم بشكل جيد.

ربما ، ولكن عدم التفكير في أن الرياضيات هي ما هي جيدة للمكتبات ، الحلول التي تم اختبارها للمعركة حتى لا تضطر أنت وأنا إلى إضاعة الوقت في مثل هذه المهام ، على سبيل المثال ، لم أكن أعرف أن هناك الكثير من المعايير للمدة ، مثل ISO 8601 ، وحدة المدد تعتني بذلك بالنسبة لي ، لذلك لست بحاجة إلى معرفة كيفية تحديد هذا المعيار.

أظن ذلك.
في كلتا الحالتين ، أقترح أن نشير إلى المكون الإضافي في الوثائق.
بهذه الطريقة ، يعرف الناس أن الوظيفة موجودة ، ولا يتعين عليهم أخذها إلى Google والبحث عن هذه الوظيفة.

في الواقع ، استغرق مني بعض الوقت لاكتشاف قسم البرنامج المساعد له.

4 سنوات وما زلت لا رد فعل من أصحاب ... هذا محزن :(

مرحبا يا رفاق،

هذا شيء ما زلنا نعمل عليه. Moment هو مجتمع تطوعي! نحتاج إلى التأكد من أن ميزة مثل هذه لها هذه الخصائص:
1) يعمل في كل بيئة
2) لا تضيف الكثير إلى الكود
3) لا تعيد اختراع العجلة (على سبيل المثال ، هناك بالفعل مكون إضافي للقيام بذلك!)
4) لا يكسر الميزات الموجودة

من الممكن أن يتم دمج هذا في وقت ما.
https://github.com/moment/moment/pull/3615

إذا كنت تعتقد أن المستندات يمكن أن تشير بشكل أفضل إلى المكون الإضافي لتنسيق المدة (أو المكونات الإضافية الأخرى!) ، فيرجى إرسال PR في طريقنا هنا: https://github.com/moment/momentjs.com/

تضمين التغريدة

لا يضيف الكثير من الحجم إلى الشفرة
لا يعيد اختراع العجلة (على سبيل المثال ، هناك بالفعل مكون إضافي للقيام بذلك!)

حسنًا ، نظرًا لوجود مكون إضافي بتنسيق المدة والمدة داخل مكتبة Mom ، فربما يكون الحل الأفضل هو إخراج المدة من moment.js إلى مكون إضافي منفصل ثم تنفيذ جميع العناصر "الثقيلة" داخل هذا المكون الإضافي؟
من خلال القيام بذلك ، سيتم تحقيق هدفين:
1) تقليل حجم Mom.js
2) توفير المدة مباشرة مع الميزات الأكثر فائدة بدلاً من الإصدار المحدود للغاية.

يتمثل أحد التحديات الكبيرة في أن تنسيق المدة سيكون من الصعب جدًا تنفيذه عبر النطاق الكامل من المواقع التي تدعمها moment.js.

أنا أكره أن أرى تلك المناطق تفقد الدعم المحدود المدة المتاح لديها حاليًا ، أو أن تضيف Moment ميزة تعمل بشكل صحيح فقط في بعض المناطق. يبدو الحفاظ على تنسيق المدة في مكون إضافي بمثابة حل وسط جيد يضمن استقرار "جوهر" moment.js ، ويعمل مع الجميع ، مع منح المستخدمين الفرديين خيار استخدام المكونات الإضافية التي تؤدي وظائف خاصة بلغتهم المحلية .

البرنامج المساعد لتنسيق المدة موجود بالفعل ويشار إليه داخل الوثائق. هذا أكثر من كاف.

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

@ luchillo17 أقرأ جميع المستندات قبل العمل مع أي شيء. ربما هذا فقط أنا.

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

@ luchillo17 ليس خطأ التوثيق أنك تفعل البرمجة الموجهة نحو الإدارة. هتافات!

بالنسبة لأولئك الذين يتابعون ملحمة فترات التنسيق ، فقد قمت بنشر الإصدار 2.0.0 من المكوِّن الإضافي لتنسيق الوقت.

يحل الإصدار الجديد / يدمج تقريبًا جميع المشكلات والتعليقات من السنوات الأربع الماضية ، كان الإصدار 1 في البرية - بما في ذلك دعم الترجمة والجمع بالإضافة إلى بعض خيارات التنسيق المفيدة.

تحقق من ذلك هنا: https://github.com/jsmreese/moment-duration-format/releases

MVP الحقيقي ->jsmreese

ههه. شكرا على الكلمات الرقيقة ،OogieBoogieInJSON.

لا يسعني إلا أن أشير إلى أن المكوِّن الإضافي الخاص بي يقف فوق - ولن يكون موجودًا بدون - الجهود الضخمة لمنشئي اللحظة ومسؤوليها ، ناهيك عن العديد والعديد من المساهمين. إن الوقت الذي أمضيته الآن في إعادة النظر في شيء قمت بإنشائه منذ أربع سنوات (واو ، هل مر وقت طويل حقًا!) يتضاءل بصراحة تامة مقارنة برعايتهم المستمرة لهذا المشروع!

تم نشر الإصدار 2.1.0 من Aaaaaand.
https://github.com/jsmreese/moment-duration-format/releases

يعمل الإصدار المحدث على إصلاح بعض المشكلات من الإصدار 2.0 ، ويقدم moment.duration.format ، وهي وظيفة جديدة للتنسيق المنسق لفترات متعددة. لا يجب الخلط بينه وبين moment.duration.fn.format الموجود بالفعل.

تأخذ الوظيفة الجديدة صفيفًا من المدد ، وتُرجع مصفوفة من السلاسل المنسقة ، وتكون مفيدة عندما يكون لديك مجموعة من المدد التي يجب تنسيقها معًا بطريقة متسقة.

moment.duration.format([
    moment.duration(1, "second"),
    moment.duration(1, "minute"),
    moment.duration(1, "hour")
], "d [days] hh:mm:ss");
// ["0:00:01", "0:01:00", "1:00:00"]

moment.duration.format([
    moment.duration(1, "minute"),
    moment.duration(1, "day")
], "w [weeks], d [days], h [hours], m [minutes], s [seconds]", { trim: "all" });
// ["0 days, 1 minute", "1 day, 0 minutes"]

jsmreese 2.0 أدى بالفعل إلى بعض الأخطاء في وقت سابق ، لذلك اضطررت إلى قفله عند 1.3.0 من أجل الأمان ، ومع ذلك أشكرك على الحفاظ على الميزة / المشروع على قيد الحياة.

prusswan ، يرجى تجربة الإصدار 2.1.0. أود أن أعرف ما إذا كنت لا تزال ترى هذه الأخطاء!

لقد قمت بنشر الإصدار 2.2.0 من تنسيق الوقت-المدة ، والذي يتضمن الآن وظيفة تنسيق رقم احتياطي لأن toLocaleString لم يتم تنفيذه بالكامل في العديد من البيئات.

https://github.com/jsmreese/moment-duration-format/releases

لقد اختبرت الإصدار الجديد باستخدام BrowserStack على مجموعة من أجهزة Android بإصدارات من 2.2 إلى 7 ، وعلى مجموعة من أجهزة iOS بإصدارات من 4.3 إلى 11. وتم اختبارها أيضًا على Chrome و Firefox و IE 8-11 ، ومتصفحات Edge.

prusswan والآخرين الذين اضطروا إلى قفل الإصدار على 1.3.0 ، ستجد على الأرجح أن الإصدار 2.2.0 هو أخيرًا البديل البديل الذي كان من المفترض أن يكون الإصدار 2.0.0.

شكرًا لجميع الذين قاموا بتسجيل المشكلات مقابل الإصدار 2 من هذا المكون الإضافي!

بعد تنفيذ الإصدار 2 من المكوّن الإضافي لتنسيق الوقت اللحظي ، هناك بعض التحسينات الواضحة للإصدار 3.

لقد أدرجت أفكاري أدناه وأضفتها كمشكلات في المستودع . إذا كانت لديك أفكار أو تعليقات حول ما تود رؤيته ، فيرجى إبلاغي بذلك!

نأمل أن يتم نشر الإصدار التالي في غضون 4 أشهر ... وليس الانتظار لمدة 4 سنوات للإصدار 2.

  • يجب تضمين خيارات تنسيق الأرقام الاحتياطية مع ملحقات كائن Moment Locale التي قمت بإنشائها بالفعل لترجمة تسميات وحدة المدة. سيؤدي هذا إلى وضع كل تكوين الترجمة في مكان واحد.

  • لا تتبع تنسيق الوقت اللحظي ووظيفة تنسيق الرقم الاحتياطي نفس واجهة برمجة التطبيقات مثل Number#toLocaleString للأرقام المهمة وأرقام الفصائل. يجب تحديث الوظيفة الاحتياطية لاستخدام toLocaleString API ، ويجب أن يعرض المكون الإضافي خيارات واجهة برمجة التطبيقات toLocaleString مباشرةً بدلاً من إخفاء بعض الخيارات وإخفائها خلف precision و خيارات useSignificantDigits .

  • إن عرض وظيفة تنسيق الأرقام الاحتياطية بالإضافة إلى وظيفة اختبار الميزة toLocaleString سيسهل الاختبار ويسمح باستخدامهما خارج سياق مدد التنسيق.

  • أضف تعريفات الأنواع لدعم TypeScript ، وانشر حزمة NuGet ، وادعم أي خيارات تغليف أخرى قيد الاستخدام هذه الأيام. (هذا لا يجب أن ينتظر حتى الإصدار 3.)

  • يجب تحديث اختبار المكون الإضافي ، بشكل مثالي لمطابقة إعداد اختبار Moment.js. (هذا لا يجب أن ينتظر حتى الإصدار 3 أيضًا.)

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

تضمين التغريدة شكرا جزيلا وفي الوقت المناسب لك! صفقة ضخمة بالنسبة لي وأشكرك على كل ما تفعله.

راجع https://momentjs.com/docs/#/ -project-status /

شكرا لكل المناقشة هنا.

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

القضايا ذات الصلة

chitgoks picture chitgoks  ·  3تعليقات

BCup picture BCup  ·  3تعليقات

M-Zuber picture M-Zuber  ·  3تعليقات

nikocraft picture nikocraft  ·  3تعليقات

RobinvanderVliet picture RobinvanderVliet  ·  3تعليقات