Moment: المدة ميزات مفقودة

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

أنا أعمل في مشروع و momentjs مفيد حقًا للتلاعب بالتاريخ لذا شكرًا على ذلك.

لإعطائك مثالاً ، نحن نصنع نوعًا ما من المتاجر لتذاكر الطائرة. وظيفة duration.humanize() طريقة غير دقيقة بالنسبة لنا.

على سبيل المثال عند المغادرة الساعة: 12:00 والهبوط الساعة 13:30. سيتم تقريبه إلى ساعتين. لكننا نحتاج إلى نوع من التفصيل الذي ينقصه Momjs.

يمكن إضفاء الطابع الإنساني افتراضيًا على مستوى 1 من الدقة بدءًا من أعلى قيمة.

// 1:30
duration.humanize()
2 hour
duration.humanize({precision: 2})
1 hour 30 minutes
duration.humanize({precision: 3})
1 hour 30 minutes 0 seconds

المشكلة الثانية هي عندما يكون هناك الرقم 0. تترجمه Momentjs على أنها "بضع ثوانٍ". لست متأكدًا من كيفية تحقيق ذلك ، لكن سيكون من الرائع الحصول على نوع من التنسيق.

// 3 days and 0 minutes
duration.format('D [and] M')
> 3 days and 0 minutes
duration.format('H [and] M')
> 72 hours and 0 minutes
duration.format('H [and] m')
> 72 hours and few minutes

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

New Feature

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

2019 ، لا تزال بحاجة إلى هذه الميزة.

ال 186 كومينتر

+1 على هذا الطلب

llacroix ، هل أنت مهتم بكتابة طلب سحب لهذا؟

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

لكن ربما ينبغي أن نناقش أكثر قليلاً حول نوع التنسيق الذي يجب القيام به. على سبيل المثال ، هل يجب عرض قيم 0 أم لا.

4 hours 20 seconds أو 0 days 4 hours 0 minutes 20 seconds

ستكون الأشهر 30 يومًا ، في السنة 365.

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

+1 لهذا
لكن نعم ، التنسيق مشكلة رئيسية هنا. إن الإنسانية والشكل مطلوبان بالتأكيد.
بعض الاقتراحات لإضفاء الطابع الإنساني على السلوك:
// 1:30
length.humanize ()؛
1 ساعة و 30 دقيقة
length.humanize ({round: "ساعات"})
ساعاتين
length.humanize ({round: "minutes"})
1 ساعة و 30 دقيقة
length.humanize ({round: "seconds"})
1 ساعة و 30 دقيقة 0 ثانية

إذا لم يتم تعريف الجولة بشكل صريح ، أعتقد أنه يجب حذف الوحدة الأعلى التي تكون قيمتها صفرًا وجميع الوحدات الأصغر منها.

// 1 ساعة 0 دقيقة و 45 ثانية
length.humanize () -> 1 ساعة
// 1 ساعة 1 دقيقة 0 ثانية
length.humanize () -> 1 ساعة و 1 دقيقة
// ساعة واحدة و 1 دقيقة و 10 ثوانٍ
length.humanize () -> 1 ساعة 1 دقيقة و 10 ثوان

أيضًا ، يجب استخدام الفاصل "و" للصلة الأخيرة ، مسبوقة بمسافات بيضاء
شهرين 6 أيام 7 ساعات و 36 دقيقة

هذه هي الطريقة التي أتخيل بها أن الوظيفة يجب أن تتصرف بشكل افتراضي

هذا هو اقتراحي للتوقيع والتنفيذ.

var duration = moment.duration({
    hours : 1,
    minutes : 0,
    seconds : 20,
    milliseconds : 0
});
duration.countdown(); // 1 hour 0 minutes 20 seconds
duration.countdown(1); // 1 hour
duration.countdown(2); // 1 hour and 0 minutes
duration.countdown(3); // 1 hour 0 minutes and 20 seconds

كما اقترح sylvainpolletvillard ، قد نرغب في إضافة معلمة

duration.countdown(3); // 1 hour 0 minutes and 1 second
duration.countdown(3, true); // 1 hour

قد نرغب أيضًا في إضافة معلمة للاحقة مثل moment.fromNow(Boolean) .

duration.countdown(3); // 1 hour 0 minutes and 1 second ago
duration.countdown(3, null, true); // 1 hour ago

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

سيتعين علينا على الأرجح إنشاء عمليات رد نداء للغات لتسلسل السلاسل نفسها. من المحتمل أن تكون هذه القواعد معقدة للغاية (أنظر إليك ، أيها المجري ).

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

var keys    = [     "h",        "mm",          "s"],
    values  = [       1,           0,           20],
    strings = ["1 hour", "0 minutes", "20 seconds"];

lang.countdown(keys, values, strings, addSuffix);

ثم ستكون الترجمة الإنجليزية شيئًا مثل هذا:

lang.countdown = function (keys, values, strings, addSuffix) {
    var i, output = "";

    for (i = 0; i < strings.length; i++) {
        if (i === strings.length - 1 && strings.length > 1) {
            output += "and ";
        }
        output += strings[i] + " ";
    }
    if (addSuffix) {
        output += "ago";
    }
}

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

ربما من الأفضل نقل هذا إلى مكون إضافي؟

بالعودة إلى المناقشة حول تنسيق المدة ، أعتقد أنه سيكون من الرائع أن يكون شيء مثل هذا ممكنًا -

moment.duration(9483000).format('d h m s') // 1 day 2 hours 20 minutes 30 seconds  
moment.duration(9483000).format('h m s') // 26 hours 20 minutes 30 seconds 
//etc...  

ربما يتم توفير معلمة منطقية في طريقة التنسيق لتحديد ما إذا كانت القيم 0 معروضة أم لا؟

لدى CLDR مخطط تنسيق قائمة وبيانات ، والتي قد تكون قادرة على استخدامها للعديد من اللغات ، وربما تظل العديد من اللغات بحاجة إلى عمليات رد نداء مخصصة على الرغم من:

http://cldr.unicode.org/development/development-process/design-proposals/list-formatting

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

دعنا نقول أنك تريد

moment.duration(9483000).format('d h m s') // 1 day 2 hours 20 minutes and 30 seconds  
// English  => 'd h m [and] s' 1 day 2 hours 20 minutes and 30 seconds
// French   => 'd, h, m [et] s'   1 jour, 2 heures, 20 minutes et 30 secondes
// Russian  => 'd h m [и] s'   1 день 2 часа 30 минут и 30 секунд

لا حاجة لردود نداء خاصة ولكن فقط سلاسل تنسيق خاصة.

الطرق المقترحة duration.countdown() و duration.countdown(1) هي بالضبط ما أبحث عنه (أي ما أفعله الآن في الكود الخاص بي).

في غضون ذلك ، هل هناك طريقة لتمديد النموذج الأولي للمدة؟

يتم عرض النموذج الأولي للمدة عبر moment.duration.fn غرار moment.fn .

لقد كنت أعمل على شيء مشابه العام الماضي على # 143 / # 192. اقترح تيم مكوّنًا إضافيًا ولكني لم أستغرق وقتًا للقيام بذلك.

كنت على وشك إعادة تشغيل عملي. اضطررت إلى تحديث المفاهيم الجديدة مثل كائنات المدة وما إلى ذلك ... كنت هذه التذكرة وغيرها. أنا الآن أعاني من أجل ما إذا كانت لا تزال هناك حاجة إليها وإذا كانت الإجابة بنعم ، فكيف يجب أن ننفذ ذلك.

لا أريد أن أرتدي حذاءًا لذا التقيت لمعرفة ما إذا كان بإمكاني المساعدة. من الذي يعمل على هذه القضية الآن؟

كان الكود الخاص بي قادرًا على التنسيق لوحدات متتالية ووحدات غير متتالية من هذا القبيل:

test.equal(moment([2012, 0, 1]).diff([2011, 0, 1], 'years\\y'), "1y");
test.equal(moment([2012, 0, 1]).diff([2011, 0, 1], 'months[m]'), "12m");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'months [months] days [days]'), "50 months 19 days");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years \\y months \\M days \\d'), "4 y 2 M 19 d");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years[y] days[d]'), "4y 80d");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years [years] weeks [weeks]'), "4 years 11 weeks");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'years\\y weeks\\w [and] days [days]'), "4y 11w and 3 days");
test.equal(moment([2016, 0, 20]).diff([2011, 10, 1], 'days\\d'), "1541d");

لم يتعامل مع الوحدات التي لم تكن بالترتيب مثل 'days years' . كما أنه لم يتعامل مع إزالة القيم الصفرية.

هذا يبدو رائعًا ، بالضبط نوع الشيء الذي كنت أتمناه!

هذه بالتأكيد ميزة مطلوبة للجميع.

أحتاج هذا!

كخيار مؤقت محتمل لبعضكم ، قمت بإنشاء مكون إضافي بسيط يسمح لك باستخدام countdown.js مباشرة من Moment:

moment("1982-5-25").countdown().toString(); // => '30 years, 10 months, 14 days, 2 hours, 23 minutes, and 50 seconds'

يمر عبر أي من خيارات العد التنازلي التي تمررها ، مثل الوحدات التي يجب استخدامها ومقدار الدقة (يمكنك إلقاء نظرة على مستندات العد التنازلي). على أي حال ، المكون الإضافي موجود هنا: https://github.com/icambron/moment-countdown

icambron شكرا لك كونتريبويتون! إنه مفيد للغاية!

لقد بدأت للتو في استخدام moment.js وسرعان ما صادفت هذه المشكلة بالضبط. هذا هو الكود الذي استخدمته لحلها:

moment.duration.fn.format = function (input) {
    var output = input;
    var milliseconds = this.asMilliseconds();
    var totalMilliseconds = 0;
    var replaceRegexps = {
        years: /Y(?!Y)/g,
        months: /M(?!M)/g,
        weeks: /W(?!W)/g,
        days: /D(?!D)/g,
        hours: /H(?!H)/g,
        minutes: /m(?!m)/g,
        seconds: /s(?!s)/g,
        milliseconds: /S(?!S)/g
    }
    var matchRegexps = {
        years: /Y/g,
        months: /M/g,
        weeks: /W/g,
        days: /D/g,
        hours: /H/g,
        minutes: /m/g,
        seconds: /s/g,
        milliseconds: /S/g
    }
    for (var r in replaceRegexps) {
        if (replaceRegexps[r].test(output)) {
            var as = 'as'+r.charAt(0).toUpperCase() + r.slice(1);
            var value = new String(Math.floor(moment.duration(milliseconds - totalMilliseconds)[as]()));
            var replacements = output.match(matchRegexps[r]).length - value.length;
            output = output.replace(replaceRegexps[r], value);

            while (replacements > 0 && replaceRegexps[r].test(output)) {
                output = output.replace(replaceRegexps[r], '0');
                replacements--;
            }
            output = output.replace(matchRegexps[r], '');

            var temp = {};
            temp[r] = value;
            totalMilliseconds += moment.duration(temp).asMilliseconds();
        }
    }
    return output;
}

ميزات هذا الرمز:

  • يستخدم نفس أحرف التنسيق كما هو موضح في: http://momentjs.com/docs/#/displaying/format/
  • يخرج العديد من الأصفار البادئة كما تريد لأي سمة من سمات المدة ، على سبيل المثال:
d=moment.duration({hours:1,minutes:1,seconds:1});
d.format('HHH:mm:ss');
"001:01:01"
  • إذا حذفت حرفًا في قالب الإدخال الخاص بك ، وكانت قيمة الحرف التالي أكبر من الحد الأقصى المعتاد ، فإنه يضيف الحرف السابق إليه ، على سبيل المثال:
d=moment.duration({days:1, hours:1, minutes: 1});
d.format('H:mm:ss');
"25:01:00"

المشاكل المحتملة:

  • يستخدم Math.floor على القيم التي تم الحصول عليها من asXxxx ، على سبيل المثال:
Math.floor(moment.duration(milliseconds)).asHours()
  • هذا يعني أنه إذا كان هناك على سبيل المثال ، قيم للدقائق أو الثواني في المدة ، لكنك تطلب وظيفة التنسيق لساعات ، فلن يتم تقريبها ، فسيتم تقريبها دائمًا.

+1 لهذا الطلب

أنا شخصياً أعتقد أنه من المنطقي تنفيذ طريقة .format() من وجود بعض القواعد الفاخرة لـ .humanize() أو إنشاء طريقة .countdown() . 95٪ من المشاكل يمكن حلها بـ .format() .

أوافق على أن .humanize() يجب أن يقدم مزيدًا من الدقة ولكن يجب أن يكون ميزة مختلفة.

مدة التنسيق أمر لا بد منه. يجب أن يكون من السهل ترجمة الثواني في سلسلة منسقة.

أحاول استخدام كود stralytic ولكن:
د = اللحظة.المدة ({الأيام: 1 ، الساعات: 1 ، الدقائق: 1}) ؛ d.format ('DH: mm: ss') ؛
"1 -215: 01: 00"

+1 لـ format()

كحالة استخدام ، يمكن تنسيق المدد المستخدمة في اختبارات التوقيت (3 ساعات) بسهولة مثل hh: mm (: ss) أو نحو ذلك ، مما سيكون أسهل بكثير. في الوقت الحالي ، من الصعب جدًا فعل الشيء نفسه في Moment حتى أشتغل في Vanilla js :)

+1 تنسيق المدة!

هذا هو الإصلاح السريع الذي استخدمته:

moment.duration.fn.format = function(){
    str = ""
    if(this.days() > 1) str = str + Math.floor(this.days()) + "d "
    if(this.hours() > 1) str = str + Math.floor(this.hours()) + "h "
    if(this.minutes() > 1) str = str + Math.floor(this.minutes()) + "m "
    if(this.seconds() > 1) str = str + Math.floor(this.seconds()) + "s "
    return str
    }

: +1: مقابل duration.format()

: +1: for duration.format () أيضًا

ما هو وضع هذا العلاقات العامة؟ هل هو بعيد؟

Code Bounty

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

llacroix شكرا :)

: +1: للمدة. تنسيق ()

 moment.duration.fn.format = وظيفة (أصفار ، رقمان) {
 ساعات var = this.hours () ، minutes = this.minutes () ، seconds = this.seconds () ؛
 var displayFormat = ''، zerosFormat = twoDigit؟ '00': '0' ، padLeft = twoDigit؟ -2: -1 ؛
 إذا (ساعات || الأصفار) {
 displayFormat + = (zerosFormat + Hours) .slice (padLeft) + 'h' ؛
 }
 إذا (دقائق || الأصفار) {
 displayFormat + = (zerosFormat + minutes) .slice (padLeft) + 'min' ؛
 }
 إذا (بالثواني || الأصفار) {
 displayFormat + = (zerosFormat + seconds) .slice (padLeft) + 's' ؛
 }
 إرجاع $ .trim (displayFormat) ؛
 }

+1 تنسيق المدة.

+1 مدة تنسيق

+1 مدة تنسيق

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

ما زلت أعمل من خلال بعض التفاصيل الصغيرة ، لكن جوهرها مكتمل وصلب. سأحصل على الكود والمواصفات والأمثلة المنشورة هنا في الأيام القليلة المقبلة. الفكرة الأساسية هي أنه يمكن أن يكون لديك أي مدة عشوائية وتنسيقها بسلسلة مشابهة لسلاسل تنسيق تاريخ اللحظة ، على سبيل المثال. length.format ("d [d] hh: mm: ss") -> 2d 03:47:24

يمكنك أيضًا تحديد الدقة العشرية التعسفية على القيمة النهائية ، على سبيل المثال. length.format ("h [hrs]"، 3) -> 42.384 ساعة

+1 للمدة تنسيق

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

حالات الاختبار وبعض الأمثلة في المشروع.
البرنامج المساعد الخاص بي يعتمد على لوداش و undercore.string.

+1 المدة تنسيق ()

تم فتح هذه التذكرة منذ أكثر من عام الآن. أشك في أنه سيتم تنفيذها على الإطلاق.

@ Maxwell2022 لقد نشرت المكوّن الإضافي moment.duration.format منذ أسبوع أو نحو ذلك:
https://github.com/jsmreese/moment-duration-format

والتي تعمل من أجلك؟

+1 لهذا أيضًا. يبدو أنه إغفال ملحوظ جدًا في مكتبة شاملة.

https://github.com/rmm5t/jquery-timeago قد يكون نموذجًا جيدًا لكيفية تنفيذ ذلك في Moment ...

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

هل هذا يعمل لحالات الاستخدام الخاصة بك؟

: +1:!

هذا من شأنه أن يعمل بالنسبة لي (ولكن لن يكون أكثر من 24 ساعة):

moment.duration.fn.format = function(format) {
  return moment(this.as('milliseconds')).format(format);
}

jsmreese الخاص بك https://github.com/jsmreese/moment-duration-format يعتمد على LoDash هو عرض حقيقي. نحن نستخدم بالفعل شرطة سفلية ، ولا يمكنني تبرير التبديل إلى LoDash فقط لهذه الميزة الصغيرة. إذا كان المكون الإضافي الخاص بك مستقلاً عن كليهما ، فهذا سيجعله خيارًا أكثر قابلية للتطبيق للعديد من الأشخاص على ما أعتقد.

wleeper أوافق تمامًا.

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

سأزيل تلك التبعيات قريبًا.

wleeper Underscore و LoDash من المفترض أن يكونا متوافقين. طالما أن jsmreese لا يستخدم أي شيء ليس في بناء Underscore لـ LoDash ، يجب أن تكون قادرًا على استخدام المكون الإضافي الخاص به كما هو دون أي مشاكل.

@ chall8908 هذا هو الشيء ، و wleeper على حق - أنا _am_ باستخدام ميزات LoDash التي ليست جزءًا من بنية Underscore.

لقد قمت بإزالة تبعية Underscore.String ، وأنا أعمل على توافق Underscore.

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

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

تعمل مكتبة Globalize الخاصة بـ jQuery على معالجة العديد من نفس المشكلات ، ويبدو أنه من المنطقي التعاون معها. يحتوي Twitter أيضًا بالفعل على مكتبة شاملة للغاية تقوم بالكثير من هذا النوع من الأشياء ...

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

duration:human(bool) // future/past dep/indep
duration:human({
  with(=min+max): 'hours'|'minutes'|'seconds',
  min: 'hours',
  max: 'days',
  float: bool,
  length: "long|short|narrow",
  abs: bool
})
  • min: ما هي أقل وحدة لاستخدامها. min: أيام ، تعني عدم قول الساعات والدقائق والثواني ، ولكن التقريب إلى أيام إذا كانت المدة أقصر من يوم
  • max: ما هي أقصى وحدة يمكن استخدامها. الحد الأقصى: الأيام ، يعني عدم استخدام الأشهر والسنوات ، ولكن بدلاً من ذلك عدد الأيام ذات الصلة
  • الطول: حجم التوكنات: اليوم مقابل د للغة الإنجليزية
  • القيمة المطلقة: المستقبل / الماضي المستقل

: +1: +1

: +1:

+1 مدة تنسيق

+1 مدة تنسيق

+1

+1

+1

هل ترغب في عرض وقت تشغيل شيء ما.

+1

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

تم نشر الإصدار 1.2.1 على شكل مدة اللحظة على NPM.
إنه يعمل في كل من Node.js والمستعرض.
إنه يعتمد على Lo-Dash أو Underscore ، ولكن يتم اختباره الآن ويعمل مع كليهما.
تمت إزالة التبعية الأصلية للشرطة السفلية.

سوف أنشر هذا الإصدار إلى Bower بمجرد حل مشكلات تسجيل / إلغاء تسجيل حزمة Bower الحالية.

+1 لشكل المدة

أتمنى أن يصبح هذا جزءًا من المكتبة.

+1

+1

+1

: +1:

+1 للمدة تنسيق ()

+1

أوه ، نعم ، سأكون بالتأكيد ، على الأقل لأتمكن من القيام بـ moment.duration(3, 'seconds').get('ss') للإخراج بقيم صفرية أولية.

ما هي حالة هذا الطلب؟ ما هي المساعدة المطلوبة لإحراز تقدم في ذلك؟

تضمين التغريدة
هذا موجود: https://github.com/jsmreese/moment-duration-format/
ويمكنك أن تفعل ما تريد ، إذا كنت لا تمانع في الاعتماد على Lo-Dash أو Underscore.
يومًا ما قريبًا سأخصص بعض الوقت لإزالة تلك التبعية ...

فوجئت بأن https://github.com/jsmreese/moment-duration-format/ ليس في stdlib عندما يكون humanize . أشعر أن هذا ينتهك مبدأ أقل الدهشة. على الأقل ، يجب أن يكون من الممكن العودة إلى تنسيق رقمي بسيط:

moment.duration(123, "minutes").format();
// "2:03:00"

أنا الآن أستخدم:

moment.utc(moment.duration(300 * 1000).asMilliseconds()).format("HH:mm:ss.SSS")
// 00:05:00.000

أحب أن أرى هذا قريبًا كجزء من Moments.js

+1

+1

في ملاحظة ذات صلة ، يُرجع [Object object] duration.toString() [Object object] . ألا يجب أن تعيد humanize() ؟

سيود +1 الحصول على مزيد من التحكم في هذا الأمر.

+1

تم نشر Moment Duration Format 1.3.0 ، والذي يزيل التبعية السابقة على Lo-Dash أو Underscore. الآن التبعية الوحيدة هي Moment.js نفسها.

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

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

تضمين التغريدة !
لماذا لم يكن هذا جزءًا من اللحظة. js نفسها ، لا أفهمها. إن الإنسانية ليست مفيدة بدون الدقة ، فلماذا أرغب في تقريب ساعة واحدة و 30 دقيقة إلى ساعة واحدة؟ .. لا توجد حالة استخدام لذلك.

+1 ، المكون الإضافي لـ jsmreese يعمل ببراعة ولكن سيكون لطيفًا إذا كان جزءًا من moment.js.

+1. يجب أن تكون هذه الميزة متاحة وإضفاء الطابع الإنساني عليها.

+1 للمدة تنسيق

نشر jsmreese مكوّنه الإضافي منذ ما يقرب من عام ، وتم فتح هذه المشكلة منذ عامين. timrwoodichernev هل نستطيع يرجى الحصول على هذا في مكتبة moment.js الرئيسية؟

+1

+1

: +1: للمدة. تنسيق

+1

: +1:

+1

ما هو الوضع الحالي لهذا؟

ربما ينتظر المشرف حتى نصل إلى 1000 ، أو ليلة رأس السنة؟ تضمين التغريدة

gkatsanos - لم أعد نشطًا في المساعدة في الحفاظ على Moment (وكنت دائمًا مجرد مساعد) ، لكن توصيتي هي طلب سحب تم اختباره جيدًا. بالتأكيد هناك شخص ما يطلب هذا على استعداد لترميزه بالفعل.

icambron هذا موجود بالفعل
من هو المشرف بالمناسبة؟

icambron هل يمكنك من فضلك الإشارة إلى البرنامج المساعد؟

ويبدو أنه مكون إضافي جيد الشكل. باستثناء حقيقة أنه يعتمد على lodash بدلاً من underscore ، فهل هناك أي أشياء أخرى تمنع جعله PR .. يبدو أنه المنفذ من lodash إلى underscore لا ينبغي أن يكون ccjsmreese

alexanderbeletskygkatsanos في الواقع قمت بإزالة التبعية lodash أو underscore منذ فترة.

إحدى العقبات الرئيسية التي تحول دون تضمين المكون الإضافي الخاص بي في نواة Moment.js هي عدم وجود دعم كامل لـ i18n.

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

jsmreese ربما إذا سأنتقل بالتأكيد للمساعدة.

mattgrandealexanderbeletsky والرموز شكل بالفعل تخصيص، والقالب شكل تعسفي، بحيث ليست قضية.

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

: +1:

+1 مدة تنسيق!

سوو .... ما هو الاتفاق مع هذا؟

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

  1. الجميع ، يمكنك فقط استخدام المكون الإضافي jsmreese . تبدو جيدة! الإضافات أشياء جيدة! ( jsmreese ، إذا كنت مائلاً جدًا ، فيمكنك إضافته إلى قائمة مكونات Moment الإضافية في الوثائق مع العلاقات العامة هنا: https://github.com/moment/momentjs.com)
  2. لن يتم تضمينها في جوهر Moment حتى أ) يقوم بتدويلها ، ب) يدمج الاختبارات في اختبارات Moment ، و ج) يرسل العلاقات العامة. بالتأكيد لن يحدث حتى يقوم شخص ما بذلك .

+1 مدة تنسيق

+1 مدة تنسيق!

+1 مدة تنسيق

+1 مدة تنسيق. حالتنا هي أننا نريد توفير وظيفة حيث يمكن للمرء أن يمرر مقدارًا من الثواني وسلسلة من شأنها تنسيقها. نقوم بذلك الآن باستخدام moment.startof ("w"). add ("s"، nrOfSeconds) .format (customFormatString)؛

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

+1 مدة تنسيق

+1 مدة تنسيق

+1 لـ duration.format

+1 للمدة تنسيق

هل يمكننا إغلاق هذا حيث يبدو أن لا أحد يقرأ هذا الخيط على ما يبدو؟

يوم الأربعاء ، 10 يونيو 2015 ، الساعة 8:30 صباحًا ، كتب SamFromDaUk [email protected] :

+1 للمدة تنسيق

-
قم بالرد على هذا البريد الإلكتروني مباشرةً أو قم بعرضه على GitHub
https://github.com/moment/moment/issues/463#issuecomment -110751635.

أو إصلاحه؟

جورج ، أعتقد أن أولئك الذين يضيفون +1 يرفضون ضمنيًا ، و
ببساطة تريد هذه الميزات.

إذا كانت الإشعارات تزعجك ، ففكر في إلغاء الاشتراك من هذا
مسلك.
في 11 حزيران (يونيو) 2015 الساعة 00:07 ، كتب "جورج كاتسانوس" [email protected] :

أو إصلاحه؟

-
قم بالرد على هذا البريد الإلكتروني مباشرةً أو قم بعرضه على GitHub
https://github.com/moment/moment/issues/463#issuecomment -110767322.

السبب الكامل لعدم امتلاك جيثب لميزة التصويت (حسب فهمي) هو أنه لا يشجع على المناقشة.

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

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

أستطيع أن أؤكد أن المكون الإضافي icambron المذكور أعلاه يعمل.

إذا كنت مثلي ، فأنت تريد .fromNow() بإنتاج أوسع (مثل العد التنازلي للشحن في أمازون). إليك كيفية القيام بذلك:

// include the plugin
var cutoffDate = moment().add(3, 'hours'); // some date in the future that we're counting down to
var now = moment();
var output = moment.duration(cutoffDate.diff(now)).format('h [hours] m [minutes] s [seconds]');
// "3 hours 0 minutes 0 seconds"

نعم ، سأوضح أيضًا - moment.duration (). تنسيق () يعمل مع هذا البرنامج المساعد: https://github.com/jsmreese/moment-duration-format

إذا كنت تستخدم النيزك ، فانتقل إلى oaf:moment-duration-format

يبدو أن هذا لا يناسبني ، فأنا أستخدم اللحظة. الفرق بين مرتين ، وهو ما ينجح ، والمشكلة هي عندما يكون الوقت بين "مساءً" و "صباحًا" ، لنفترض أنني أسافر في الساعة 9 مساءً والهبوط 2 صباحًا ، يجب أن أحصل على الوقت الصحيح.

@ Markj89 تحتاج إلى فتح موضوع stackoverflow.

+1

+1

+1

: +1:

+1 عند إغلاق هذه القضية. استخدام البرنامج المساعد هو حل قوي.

+1

+1

+1 على .format()

+1 ، لم يتم تنفيذه بعد 4 سنوات؟ :د

+1

بالمناسبة. أعتقد أنه ينبغي أن يكون من الممكن تحليل التنسيق المتوافق مع البشر أيضًا. على سبيل المثال ، ليس من الصعب تحليل 7 days and 5 hours ...

أردت فقط التأكيد على أن المكون الإضافي jsmreese يعمل بشكل رائع!

: +1:

+1 مدة تنسيق

+1 تنسيق المدة

+1 مدة تنسيق

+1 مدة تنسيق

: +1:

سأغلق هذا لصالح # 1048. هذا لا يعني أنه قد انتهى ، فقد واجهنا مشكلتين مضى عليهما عدة سنوات وكلاهما يتلخص في "إنشاء تنسيق المدة". الآخر يفسر هذا بشكل أوضح.

+1 مدة تنسيق

+1 مدة تنسيق

+1

استخدم .localeData (). dynamicTime (45، true، "mm") واحصل على 45 دقيقة ، وهكذا ؛)

+1 تحدث كثيرًا عن هذا ومع ذلك لم يتم تنفيذه. حتى أن هناك حزمة منفصلة لهذا https://github.com/jsmreese/moment-duration-format

لعرض المدة بأي تنسيق ، ما عليك سوى تحويل المدة إلى مللي ثانية ثم إلى اللحظة:
moment(duration.as('milliseconds')).format('HH:mm:ss')

شكر! هل هذا في المستندات؟ لم اراه ...

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

بعض الأشياء حول هذا الرمز:

  1. رمز hh هو رمز من المفترض استخدامه مع AM / PM ، لذلك سترتفع مدتك حتى 12 فقط

  2. حتى إذا كنت تستخدم رمز HH ، والذي سيرتفع إلى 23 ، فلا يمكن أن تكون مدتك أطول من 23: 59: 59.999 ، حيث ستنتقل الأشياء إلى التاريخ التالي

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

إذا كنت تريد استخدام هذا الاختراق ، فيجب كتابته على النحو التالي:

moment.utc(duration.as('milliseconds')).format('HH:mm:ss')

لكن كما أشرت ، لن ينجح هذا إلا إذا كانت مدتك أقل من 24 ساعة. فوق ذلك ، عد إلى المربع 1.

شكر. لقد استغرق الأمر بعض الوقت اليوم لمعرفة أنه يمكن للمرء أن يربط بين .minutes() مع .seconds() . اتصل بي يا غبي ، لكن لم يكن واضحًا بالنسبة لي من المستندات الفرق بين .seconds() و .asSeconds() على الفور ... لكن الآن أرى أنه موجود بالفعل! :)

على سبيل المثال: console.log(duration.minutes()+":"+duration.seconds());

سألتزم بهذه الطريقة.

elasticsteve قد ترغب أيضًا في إضافة صفر

butterflyhugelasticsteve هذا هو السبب الرئيسي وراء رغبتي في استخدام format . في حالتي ، إنه عداد بسيط لوقت قصير ، لذا فإن حل
moment.utc(duration.asMilliseconds()).format('HH:mm:ss')

@ sagivo نقطة جيدة! الآن يبدو حل maggiepint أكثر جاذبية. الخادم الخاص بي هو UTC على أي حال.

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

+1

+1 مدة تنسيق () !!!!!!!!!

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1 مدد يصعب تصحيحها

+1

يمكنك بسهولة القيام بشيء مثل:

    var duration = moment().add(5, 'days') -  moment().local();
    var s = Math.floor( (duration/1000) % 60 );
    var m = Math.floor( (duration/1000/60) % 60 );
    var h = Math.floor( (duration/(1000*60*60)) % 24 );
    var d = Math.floor( duration/(1000*60*60*24) );
    return d + ' days ' + h + ' hours ' + m + ' minutes ' + s  + ' seconds before the deadline.';   
    // 4 days 23 hours 59 minutes 59 seconds before the deadline.

طلب مستخدم واحد TwitterToon_Ladyboy

يمكنك بسهولة القيام بشيء مثل:

    var duration = moment().add(5, 'days') -  moment().local();
    var s = Math.floor( (duration/1000) % 60 );
    var m = Math.floor( (duration/1000/60) % 60 );
    var h = Math.floor( (duration/(1000*60*60)) % 24 );
    var d = Math.floor( duration/(1000*60*60*24) );
    return d + ' days ' + h + ' hours ' + m + ' minutes ' + s  + ' seconds before the deadline.';   
    // 4 days 23 hours 59 minutes 59 seconds before the deadline.

قبيح ، لكنه فعال.

2019 ، لا تزال بحاجة إلى هذه الميزة.

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

هناك طريقة رائعة moment تسمى fromNow() والتي ستعيد الوقت من وقت محدد في شكل لطيف يمكن قراءته من قبل الإنسان ، مثل هذا:

moment('2019-04-30T07:30:53.000Z').fromNow() // an hour ago || a day ago || 10 days ago

أو إذا كنت تريد ذلك بين تاريخين محددين يمكنك استخدام:

var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.from(b); // "a day ago"

مأخوذة من المستندات:

هل يمكن إعادة فتح هذا؟ هذه وظيفة أساسية للغاية.

في حالتي وجدت حزمة حلت مشاكلي:
https://github.com/EvanHahn/HumanizeDuration.js

ربما يكون مفيدًا لشخص آخر أيضًا. :)

يوليو 2019 وهذه الميزة لا تزال غير متوفرة.

يوليو 2019 وهذه الميزة لا تزال غير متوفرة.

لم أجربها بعد ، لكنني لاحظت ذلك للتو!
npm install moment-duration-format

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

سبتمبر 2019 لا يزال يفتقد هذه الميزة رسميًا

d.format('H:mm:ss');
"1:01:01"

أتمنى أيضًا أن يكون لديها هذه الميزة

d.format('D-H:mm:ss'); // existence of D will mod hours to 24
"999-23:59:59"

في حال كان أي شخص يتساءل لماذا تم إغلاق هذا: https://github.com/moment/moment/issues/463#issuecomment -228543000

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

// What I did:
private getTimeString(duration: moment.Duration): string {
    const time = moment()
      .seconds(duration.seconds())
      .minutes(duration.minutes());

    return time.format('mm:ss');
}

// What I'd rather do (as many others have mentioned)...
private getTimeString(duration: moment.Duration): string {
    return duration.format('mm:ss');
}

حل مبتكر لي:

import moment from 'moment';

const formatInt = (int: number): string => {
  if (int < 10) {
    return `0${int}`;
  }
  return `${int}`;
};

export const formatDuration = (time: string): string => {
  const seconds = moment.duration(time).seconds();
  const minutes = moment.duration(time).minutes();
  const hours = moment.duration(time).hours();
  if (hours > 0) {
    return `${formatInt(hours)}:${formatInt(minutes)}:${formatInt(seconds)}`;
  }
  if (minutes > 0) {
    return `${formatInt(minutes)}:${formatInt(seconds)}`;
  }
  return `00:${formatInt(seconds)}`;
};

2020

أستخدم الطريقة التالية ، فقد تكون مفيدة لشخص آخر :)

function formatDuration(duration, format) {
  const date = moment().startOf('day');
  return date.add(duration).format(format);
}

(أستخدم فقط لتنسيق المدد بين 00:00 و 23:59)

ما زلت بحاجة إلى هذا

تساعد ميزة "get" هذه على التنسيق بالطريقة التي تريدها:

  duration.get('years')
  duration.get('months')
  duration.get('days')
  duration.get('hours')
  duration.get('minutes')
  duration.get('seconds')

ما أعمل معه:

const formatDuration = ms => {
  const days = Math.floor(ms / 8.64e7);
  const msOnLastDay = ms - days * 8.64e7;
  return (days < 10 ? "0" + days : days) + ":" + moment.utc(msOnLastDay).format("HH:mm:ss.SSS");
};
formatDuration(5)
"00:00:00:00.005"
formatDuration(500)
"00:00:00:00.500"
formatDuration(50000)
"00:00:00:50.000"
formatDuration(5000000)
"00:01:23:20.000"
formatDuration(500000000)
"05:18:53:20.000"
// for reference
JSON.stringify(moment.duration(500000000)._data, null, 2)
"{
  "milliseconds": 0,
  "seconds": 20,
  "minutes": 53,
  "hours": 18,
  "days": 5,
  "months": 0,
  "years": 0
}"

يوليو 2019 وهذه الميزة لا تزال غير متوفرة.

لم أجربها بعد ، لكنني لاحظت ذلك للتو!
npm install moment-duration-format

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

هذا يعمل بشكل جيد :)

انتهت اللعبة :)

شكرا ، نقدر ذلك !!!


من: أليكسي ماكاس [email protected]
Enviado: sexta-feira، 9 de outubro de 2020 11:03
الفقرة: لحظة / لحظة لحظيةnoreply.github.com
نسخة إلى: Douglas Aguiar [email protected] ؛ التعليق [email protected]
Assunto: Re: [لحظة / لحظة] مدة الميزات المفقودة (# 463)

انتهت اللعبة :)

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرةً ، أو قم بعرضه على GitHub https://github.com/moment/moment/issues/463#issuecomment-706200427 ، أو قم بإلغاء الاشتراك https://github.com/notifications/unsubscribe-auth/AGD22DRNGNIQMOJFQY7VW3DSJ4J4VANCNFSM4 .

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