Moment: рдлрд╝реАрдЪрд░ рдЕрдиреБрд░реЛрдз: рдЕрдзрд┐рдХ рд╕рдЯреАрдХ .рдорд╛рдирд╡реАрдХрд░рдг

рдХреЛ рдирд┐рд░реНрдорд┐рдд 24 рдЬреВрди 2012  ┬╖  112рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: moment/moment

рдЬрдм рд╕реЗрдХрдВрдб рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ .humanize рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

moment.duration(40, 's').humanize() === "a few seconds" // expected "40 seconds"
moment.duration(45, 's').humanize() === "a minute" // expected "45 seconds"

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЕрдХреНрд╕рд░ рдЗрд╕ рд╕реНрддрд░ рдХреА рд╕рдЯреАрдХрддрд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рд╣рдо рдорд╛рдирд╡ рдкрдардиреАрдп рддрд░реАрдХреЗ рд╕реЗ рд╕рдЯреАрдХ рдорд╛рди рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ (рдЬреЛ рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ рдЙрд╕рд╕реЗ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИ):

moment.duration(40, 's').humanize() === "a few seconds"
moment.duration(40, 's').humanize(true) === "in a few seconds"

moment.duration(40, 's').humanize({precise:true}) === "40 seconds"

moment.duration(40, 's').humanize({suffix:true, precise:true}) === "in 40 seconds"
moment.duration(40, 's').humanize({precise:false, suffix:true}) === "in a few seconds"

рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ ?

Enhancement New Feature

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

moment.duration(183, "minutes").humanize() // 3 hours

рд╕рдЯреАрдХ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ: 3 рдШрдВрдЯреЗ рдФрд░ 3 рд╕реЗрдХрдВрдбред

рд╕рднреА 112 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@FGRibreau , рдпрд╣ рдореБрджреНрджрд╛ # 232 рдореЗрдВ рдЖрдпрд╛ рдерд╛, рдФрд░ рд╡рд╣рд╛рдВ рдкрд░ рдУрдкреА рдареАрдХ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ рдХреЛрд░ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдЬрдм рдЖрдк рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рдордп рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк precise-english рдпрд╛ рдХреБрдЫ рдФрд░ рдирд╛рдордХ рднрд╛рд╖рд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВред 1.7.0 рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдирдП рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд▓реИрдВрдЧ рдлреАрдЪрд░ рдХреЗ рд╕рд╛рде, рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрднреА рдХреЛрдИ рднреА рднрд╛рд╖рд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ рд╕рднреА рдЧреИрд░-рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧреА, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рдордп рд╢рдмреНрджрдХреЛрд╢ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рднреАрддрд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг рд╢рдмреНрджрдХреЛрд╢ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: # 232 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдЕрдм 1.7.0 рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ #332 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдЖ рд╣реИред

moment.lang('precise-en', {
    relativeTime : {
        future : "in %s",
        past : "%s ago",
        s : "%d seconds", //see https://github.com/timrwood/moment/pull/232#issuecomment-4699806
        m : "a minute",
        mm : "%d minutes",
        h : "an hour",
        hh : "%d hours",
        d : "a day",
        dd : "%d days",
        M : "a month",
        MM : "%d months",
        y : "a year",
        yy : "%d years"
    }
});

// one way
moment.lang('precise-en');
moment.duration({s: 40}).humanize();

// other way
moment.duration({s: 40}).lang('precise-en').humanize();

рдПрдХ рдЪреАрдЬ рдЬреЛ рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИ рд╡рд╣ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧреА рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ relativeTime рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ рдХреЗрд╡рд▓ рдПрдХ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдкрдбрд╝реЗред @timrwood , рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ _smarter_ рд╡рд┐рд░рд╛рд╕рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдпрджрд┐ рд╣рдо рдмреЗрд╣рддрд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рд╕рдВрднрд╡рддрдГ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рд╕реАрдПрд▓рдбреАрдЖрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЙрдк-рднрд╛рд╖рд╛ рдорд╛рд╕реНрдЯрд░ рднрд╛рд╖рд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИред рддреЛ fr_CA рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛ fr рдФрд░ en_GB рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛ en ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ 'рд░рд┐рд╢реНрддреЗрджрд╛рд░ рд╕рдордп' рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд╣рди рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@FGRibreau рдиреЗ рдЖрдкрдХреЗ рд▓рд┐рдП precise-en рднрд╛рд╖рд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛рд░реНрдп рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫ рдХрд┐рдпрд╛?

рдЗрд╕реЗ @rockymeza рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рдХрд░рдирд╛ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдкрд╕рдВрджреАрджрд╛ рддрд░реАрдХрд╛ рд╣реИред

рдпрд╣ рдХреЗрд╡рд▓ рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рд╡рд╣реА рдШрдВрдЯреЛрдВ, рд╡рд░реНрд╖реЛрдВ рдЖрджрд┐ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ ...

рд╣рд╛рдВ, рдФрд░ рдкрд╕рдВрджреАрджрд╛ рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рдЕрдВрдЧреНрд░реЗрдЬреА рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╢реНрд░рд╡рдг рдХреЗ рд▓рд┐рдП рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЖрдкрдХреЛ рд╕рдВрдЬреНрдЮрд╛ рд╡рд┐рднрдХреНрддрд┐рдпреЛрдВ (рдШреЛрд╖рдгрд╛рдУрдВ) рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рд╡рдЬрди рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВред рдЙрд▓рдЯреА рдЧрд┐рдирддреА рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╕рдордп, рд╕рдЯреАрдХрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЗрд╕рд▓рд┐рдП рдкрд┐рдЫрд▓реА рдЪреАрдЬреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП "10 рдШрдВрдЯреЗ рдкрд╣рд▓реЗ" рд╣реЛрдирд╛ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХрд╛ рдмреЗрд╕рдмреНрд░реА рд╕реЗ рдЗрдВрддрдЬрд╛рд░ рд╣реИ, рддреЛ рдореБрдЭреЗ "10 рдШрдВрдЯреЗ 3 рдорд┐рдирдЯ 8 рд╕реЗрдХрдВрдб рдореЗрдВ" рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдпрд╣ рдордд рдмрддрд╛рдУ рдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рднрд╛рд╖рд╛ рд▓рд┐рдЦрдиреА рд╣реИ?

moment.duration(183, "minutes").humanize() // 3 hours

рд╕рдЯреАрдХ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ: 3 рдШрдВрдЯреЗ рдФрд░ 3 рд╕реЗрдХрдВрдбред

рдореБрдЭреЗ рднреА рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдПрдХ рд╕рдЯреАрдХ рдорд╛рдирд╡рдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ!

рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЛрдореЗрдВрдЯ рдХреЗ рдорд╛рдирд╡реАрдХрд░рдг рдХреЗ рд▓рд┐рдП (рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ) рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЬреЛ рдХреЛрдИ рднреА рдпрд╣рд╛рдВ рдЕрднреА рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЖрдпрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ HumanizeDuration.js рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

var
  moment = require('moment'),
  humanizeDuration = require('humanize-duration');

console.log(humanizeDuration(moment.duration('PT1H15M').asMilliseconds())); // '1 hour, 15 minutes'

// whereas:

console.log(moment.duration('PT1H15M').humanize()); // 'an hour'

рдПрдХ "рд╕рдЯреАрдХ рдорд╛рдирд╡реАрдХрд░рдг" рд╡рд┐рдХрд▓реНрдк рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛, рдкрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ ..

рд╕рдЯреАрдХ рдорд╛рдирд╡реАрдХрд░рдг рдХреЗ рд▓рд┐рдП +1!

рдпрд╣ рджреЗрдЦрдХрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░рд╛рд╢рд╛ рд╣реБрдИ рдХрд┐ рд╕рдЯреАрдХ рдорд╛рдирд╡рдХреГрдд рдЕрд╡рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред :|

рдбреЙрдХреНрд╕ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рд╕рдЯреАрдХ рд░реЗрдВрдЬ рдирд╛рдордХ рдХреБрдЫ рдкреНрд▓рдЧрдЗрди рд╣реИред рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ?

рд╕рдЯреАрдХ рд░реЗрдВрдЬ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкрд▓ рд╡рд╕реНрддреБ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рдирд╣реАрдВ рдЪреБрди рд╕рдХрддрд╛ рдХрд┐ рдореБрдЭреЗ рдХреМрди рд╕реЗ рджрд┐рдирд╛рдВрдХ рднрд╛рдЧ рдкрд╕рдВрдж рдЖ рд╕рдХрддреЗ рд╣реИрдВред

рднрд╛рд╖рд╛ (рдЗрдореЛ) рднреА рдереЛрдбрд╝реА рд╣рдЯрдХрд░ рд╣реИ, рдПрдХ рдкрд░рд┐рдгрд╛рдо рдерд╛- 'рдПрдХ рдШрдВрдЯрд╛ 19 рдорд┐рдирдЯ рдХреБрдЫ рд╕реЗрдХрдВрдб'ред рдореИрдВ 1 рдШрдВрдЯрд╛ 19 рдорд┐рдирдЯ рдФрд░ рдХреБрдЫ рд╕реЗрдХрдВрдб рдЬреИрд╕рд╛ рдХреБрдЫ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рд╢рдмреНрджреЛрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдорд┐рд▓рд╛рдирд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╡реНрдпрд╛рдХрд░рдгрд┐рдХ рд╕рдВрдЦреНрдпрд╛-рдирд╣реАрдВ (рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ) рд░рд╣рд╛ рд╣реИред

+1 рд╕рдЯреАрдХ рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдорд╛рдирд╡реАрдХрд░рдг

@Envek рд╕рдЯреАрдХ рд░реЗрдВрдЬ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрд┐рд╕реА рднреА i18n/l10n рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ...

рдореЛрдореЗрдВрдЯ.рдЬреЗрдПрд╕ рджреНрд╡рд╛рд░рд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рдорд░реНрдерди рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЕрдкрдиреА рдХрдо рд╕реЗ рдХрдо рджреЛ рдпрд╛ рддреАрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

@рдЯреЛрдкрд╛рдХреНрд╕реА +1

+1

@doingweb рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ HumanizeDuration.js рдореЙрдбреНрдпреВрд▓ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

+1 рд╕рдЯреАрдХ рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдорд╛рдирд╡реАрдХрд░рдг

+1 рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдорд╛рдирд╡реАрдХрд░рдг

+1

+1

+1

+1

+1

+1

+1

рдпрд╣ рд╣рд░ рд╕рдордп рдмрдВрдж рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдпрд╣ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреЗрдПрд╕ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪреМрдВрдХ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдордВрдЪреЛрдВ рдкрд░ рдкреЛрд╕реНрдЯ рдХреА рддрд░рд╣ рдХреБрдЫ рдЕрд╕реНрдкрд╖реНрдЯ рд╕рдордп рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд╣реАрдВ рднреА рдорд╛рдирд╡реАрдХрд░рдг рд╕рд╛рджрд╛ рдмреЗрдХрд╛рд░ рд╣реИред

+1

+1

+1

-1. рдореБрдЭреЗ рдорд╛рдирд╡реАрдХрд░рдг рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЕрд╡рдзрд┐ рдХрд╛ "рдорд╛рдирд╡ рдХреЗ рдЕрдиреБрдХреВрд▓" рд╕рдВрд╕реНрдХрд░рдг рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

"рдЕрд░реЗ рдлреНрд░реИрдВрдХ, рдЖрдкрдиреЗ рд╡рд╣ рдИрдореЗрд▓ рдХрдм рднреЗрдЬрд╛?"
"рд▓рдЧрднрдЧ рдПрдХ рдорд┐рдирдЯ рдкрд╣рд▓реЗред"

рдмрдирд╛рдо

"рдЕрд░реЗ рдлреНрд░реИрдВрдХ, рдЖрдкрдиреЗ рд╡рд╣ рдИрдореЗрд▓ рдХрдм рднреЗрдЬрд╛?"
"рдЪрд╛рд▓реАрд╕ рд╕реЗрдХрдВрдб рдкрд╣рд▓реЗред"

рдЬреЛ рдЕрдзрд┐рдХ "рдорд╛рдирд╡" рд▓рдЧрддрд╛ рд╣реИ?

рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдпрд╣ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рд╣реИред

+1, @mattgrande рдЬрдмрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдм рдЬреЛ рдХреБрдЫ рд╣реИ рд╡рд╣ рдЕрддреАрдд рдореЗрдВ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рдЕрд╡рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпреБрдХреНрддрд┐ рдХреА рд▓рдВрдмрд╛рдИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "1 рдШрдВрдЯрд╛, 30 рдорд┐рдирдЯ"ред

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдУрд░ рд╕реЗ +1ред рдПрдХ рдирдИ рднрд╛рд╖рд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдмрдирд╛рдирд╛, рдпрд╛ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореЛрдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд 108 рднрд╛рд╖рд╛рдПрдБ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╛ рддреЛ 108 рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдФрд░ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрди рд╕рднреА рдХреЛ рд╡реНрдпрд╛рдХрд░рдгрд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣реА рдкрд╛рдПрдВрдЧреЗ), рдпрд╛ рдмрд╕ рдРрд╕реЗ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдПрдБ рдЬреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рдирд╣реАрдВ рдмреЛрд▓рддреЗ рд╣реИрдВ? рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд▓рдЧрддрд╛ ...

рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

````рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рд╡рд░ рдорд╛рдирд╡реАрдХрд░рдг рдЕрд╡рдзрд┐ = рд╕рдорд╛рд░реЛрд╣ (рдШрдЯрдирд╛ рдЕрд╡рдзрд┐) {
eventMDuration = рдкрд▓ред рдЕрд╡рдзрд┐ (eventDuration, 'рд╕реЗрдХрдВрдб');
рдШрдЯрдирд╛ рдЕрд╡рдзрд┐рд╕реНрдЯреНрд░рд┐рдВрдЧ = ""
рдЕрдЧрд░ (eventMDuration.days() > 0)
eventDurationString += "" + рдкрд▓ред рдЕрд╡рдзрд┐ (eventMDuration.days (), 'рджрд┐рди')ред рдорд╛рдирд╡реАрдХрд░рдг ()
рдЕрдЧрд░ (eventMDuration.hours() > 0)
eventDurationString += "" + рдкрд▓ред рдЕрд╡рдзрд┐ (eventMDuration.hours(), 'hours').humanize()
рдЕрдЧрд░ (eventMDuration.minutes ()> 0)
eventDurationString += "" + рдкрд▓ред рдЕрд╡рдзрд┐ (eventMDuration.minutes (), 'рдорд┐рдирдЯ')ред рдорд╛рдирд╡реАрдХрд░рдг ()

рд╡рд╛рдкрд╕реА рдШрдЯрдирд╛DurationString.trim ()
}
````

+1

+1 рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд┐рдирд╛, рд╕рдордп рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдореБрджреНрджрд╛ рдХреНрдпреЛрдВ рдмрдВрдж рд╣реИ?

+1

+1

+1

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдЬрдмрдХрд┐ рдЕрднреА рднреА 'рдорд╛рдирд╡' рд╡рд┐рдХрд▓реНрдк рд╕реБрдкрд░ рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛрдЧрд╛ред

+1

+1

+1

+1

+1ред рдПрдХрд╛рдЙрдВрдЯреЗрдВрд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрд╡рдзрд┐ рдХреЛ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рд▓реЗрдХрд┐рди рдорд╛рдирд╡ рдкреНрд░рд╛рд░реВрдк рдореЗрдВред "1 рд╕рд╛рд▓, 2 рдорд╣реАрдиреЗ, 3 рджрд┐рди" "398 рджрд┐рди" рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ "1 рд╕рд╛рд▓" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрддрдирд╛ рдорд╛рдирд╡реАрдп рд╣реИ рдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ рдмреЗрдХрд╛рд░ рд╣реИред

+1

duration.humanize рдореЗрдВ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рд╣реИрдВ рдЬреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдЗрдХрд╛рдИ рдХреЛ рдПрдХ рдорд┐рдирдЯ, рдПрдХ рдШрдВрдЯрд╛ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 45 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рдХреЛ рдПрдХ рдорд┐рдирдЯ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, 22 рдШрдВрдЯреЗ рд╕реЗ рдЕрдзрд┐рдХ рдХреЛ рдПрдХ рджрд┐рди рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдЙрди рдХрдЯрдСрдл рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП moment.relativeTimeThreshold(unit, limit) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдЗрдХрд╛рдИ ss , s , m , h , d рд╕реЗ рдПрдХ рд╣реИ , M ред

https://momentjs.com/docs/#/customization/relative -time-threshold/

+1

+1

+1, рдХреГрдкрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреЛрд▓рдиреЗ рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ

+1

+1

+1

+1

+1

+1

рдореИрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

function stringifyDuration(duration) {
    // Return a human readable string representing the given moment duration

    // Split the duration into parts, and drop the most significant parts with a value of 0
    const durationParts = _.dropWhile([
        { value: duration.years(), unit: 'year' },
        { value: duration.months(), unit: 'month' },
        { value: duration.days(), unit: 'day' },
        { value: duration.hours(), unit: 'hour' },
        { value: duration.minutes(), unit: 'minute' },
        { value: duration.seconds(), unit: 'second' },
        { value: duration.milliseconds(), unit: 'millisecond' },
    ], (part) => part.value === 0);

    // Display up to two of the most significant remaining parts
    return _.take(durationParts, 2).map((part) => (
        `${part.value} ${pluralize(part.unit, part.value)}`
    )).join(', ');
}
> stringifyDuration(moment.duration(26, 'hours'))
"1 day, 2 hours"

рд▓реЙрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрд╡рдЪрди рдХрд░рддрд╛ рд╣реИред

@timrwood рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛:

  1. @rockymeza рдХреЗ https://github.com/moment/moment/issues/348#issuecomment -6535794 рд╕рдорд╛рдзрд╛рди рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ (рд╣рд░ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЛ) рдЗрд╕реЗ рд╣рд░ рдЙрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рд╡реЗ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЖрдк рдФрд░ рдЖрдкрдХреЗ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдЕрджреНрднреБрдд рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ
  2. @mattgrande https://github.com/moment/moment/issues/348#issuecomment -237830415 рддрд░реНрдХ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдорд╛рдирд╡реАрдп рд╣реИ, рдмрд╕ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдмреБрд▓рд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЙрд╕ рддрд░рд╣ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдмрд╛рддрдЪреАрдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рд╣реЗ рдлреНрд░реИрдВрдХ, рдореИрдВ рджреЛрдкрд╣рд░ рдХрд╛ рднреЛрдЬрди рд▓реЗрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдЧрд▓реА рдмреИрдардХ рддрдХ рдХрд┐рддрдирд╛ рд╕рдордп рд╣реИ?
рдПрдХ рдШрдВрдЯрд╛

Now, let's see what that "hour" can mean in `moment`:

```js
moment.duration({hours: 0, minutes: 45}).humanize() === "an hour"
moment.duration({hours: 1, minutes: 29}).humanize() === "an hour"
```
This means that if we understand things differently I could be ~45 minutes early or late for that meeting.
  1. RTFM рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @sproot рдХреЛ рдзрдиреНрдпрд╡рд╛рдж

    moment.relativeTimeThreshold('m', 60);
    moment.duration({hours: 0, minutes: 45}).humanize() === "45 minutes"
    moment.duration({hours: 0, minutes: 59}).humanize() === "59 minutes"
    moment.duration({hours: 0, minutes: 60}).humanize() === "an hour"
    moment.duration({hours: 1, minutes: 29}).humanize() === "an hour"
    

    рдпрд╣ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ рдЬрдм рдмреНрд░реЗрдХ рдХреА рд▓рдВрдмрд╛рдИ 60 рдорд┐рдирдЯ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛред рдЙрд╕ ~ 30 рдорд┐рдирдЯ рдХреЗ рдЕрдВрддрд░ рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдШрд░ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реВрдВ, рдпрд╛ рдореБрдЭреЗ рдкрд╛рд╕ рдореЗрдВ рдХреБрдЫ рд▓реЗрдирд╛ рд╣реИред

  2. @Nerian рдХреЗ рд╕рдорд╛рдзрд╛рди https://github.com/moment/moment/issues/348#issuecomment -279819773 рдФрд░ @cogwirrel https://github.com/moment/moment/issues/348#issuecomment -346233713 @sproot рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд ' s рдЯрд┐рдк рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ "рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рд▓рддрд╛ рд╣реИ (_ рднрд╛рдЧреЛрдВ рдХреЛ рд╕рд╛рджреЗ рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рд╣реИрдХ рд╣реИ рдЬрд┐рд╕реЗ рд╕реАрдзреЗ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

    var el = document.createElement('script');
    el.src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js";
    document.head.appendChild(el)
    moment.relativeTimeThreshold('s', 60);
    moment.relativeTimeThreshold('ss', 0); // must be after 's', disables "few seconds"
    moment.relativeTimeThreshold('m', 60);
    moment.relativeTimeThreshold('h', 24);
    moment.relativeTimeThreshold('d', 31);
    moment.relativeTimeThreshold('M', 12);
    /**
     * Return a precize human readable string representing the given moment duration.
     *
     * <strong i="34">@param</strong> {Moment.Duration} duration
     * <strong i="35">@param</strong> {{mostPreciseUnit: string, numberOfSignificantParts: integer}} options
     */
    moment.duration.fn.humanizePrecisely = function(options = {}) {
        // Split the duration into parts to be able to filter out unwanted ones
        const allParts = [
            { value: this.years(), unit: 'years' },
            { value: this.months(), unit: 'months' },
            { value: this.days(), unit: 'days' },
            { value: this.hours(), unit: 'hours' },
            { value: this.minutes(), unit: 'minutes' },
            { value: this.seconds(), unit: 'seconds' },
            // cannot format with moment.humanize()
            //{ value: duration.milliseconds(), unit: 'milliseconds' },
        ];
    
        return _(allParts)
            // only use the first parts until the most precise unit wanted
            .take(_.findIndex(allParts, {unit: options.mostPreciseUnit || 'seconds'}) + 1)
            // drop the most significant parts with a value of 0
            .dropWhile((part) => part.value === 0)
            // skip other zeroes in the middle (moment.humanize() can't format them)
            .reject((part) => part.value === 0)
            // use only the significant parts requested
            .take(options.numberOfSignificantParts || allParts.length)
            // format each part
            .map((part) => moment.duration(part.value, part.unit).locale(this.locale()).humanize())
            .join(' ');
    }
    moment.duration({hours: 2, minutes: 3, seconds: 4}).locale('de').humanizePrecisely()
        // === "2 Stunden 3 Minuten 4 seconds"
    

    (рдиреЛрдЯ: рд╕реЗрдХрдВрдб рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдФрд░ рд▓реЛрдХреЗрд╢рдВрд╕ рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ, рдЬрд┐рд╕реЗ #3981 рджреНрд╡рд╛рд░рд╛ #4183 рдореЗрдВ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред)

рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрднреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╕реЗ рдкрд╛рдпрд╛ рд╣реИ:

https://momentjs.com/docs/#/plugins/preciserange/

рдореЗрд░рд╛ рдЕрдкрдирд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ - рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

    var d1 = new Date()
    var d2 = new Date(durationInMinutes * 60 * 1000)
    return moment.preciseDiff(d1 - d2)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ ...?

@mercmobily рдПрдпреВ, рдпреВрдПрд╕ (рд╕реАрдП), рдпреВрдХреЗ рдХреЗ рд▓рд┐рдП: рд╣рд╛рдБ, рдкрдВрдХреНрддрд┐: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ; рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм https://github.com/codebox/moment-precise-range/issues/6 рддрдп рд╣реЛред

(рд╕рд┐рдбреЗрдиреЛрдЯ: moment рдФрд░ *60*1000 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдкрдиреЗ moment().add(durationInMinutes, 'minutes') рдорд╛рдирд╛ рд╣реИ?)

рдЖрд╣, рдореИрдВ рдореЛрдореЗрдВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд╛рдХрд┐рдл рдирд╣реАрдВ рд╣реВрдБ! moment().add(durationInMinutes, 'minutes') рдХреНрдпрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдпрд╣ рдореБрджреНрджрд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ "рд╕рдорд╛рдзрд╛рди" рд╣реИ ...

moment() "рдЕрднреА" рд╣реИ ( new Date() рдХреЗ рд╕рдорд╛рди), рдФрд░ add рдЗрд╕рдореЗрдВ n рдорд┐рдирдЯ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдХреНрд╖рдг рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ "рдЕрднреА" рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред (рдЗрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рдХреЛ рдХреЗрдВрджреНрд░рд┐рдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╕рд┐рдбреЗрдиреЛрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рд╣реЛрдиреЗ рджреЗрдВ;)

+1

+2

+1

+1

+1

рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВред рдореЗрд░рд╛ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ "рд╣рд░ 12 рд╕реЗрдХрдВрдб" рдХреЛ "рд╣рд░ рдХреБрдЫ рд╕реЗрдХрдВрдб" рдореЗрдВ рдмрджрд▓рдирд╛ рдпрд╛ "рд╣рд░ 54 рд╕реЗрдХрдВрдб" рдХреЛ "рд╣рд░ рдорд┐рдирдЯ" рдореЗрдВ рдмрджрд▓рдирд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред

+1

+1

рдореИрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

moment.duration('PT5S').humanize();

рдФрд░ рдореИрдВ рдЗрд╕реЗ рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛: '5 рд╕реЗрдХрдВрдб' рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣ 'рдХреБрдЫ рд╕реЗрдХрдВрдб' рдХрд╣рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рд╕рдорд░реНрдерди рдХреЛ рдХрдм рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?

+1

+1

рдпрд╣рд╛рдБ @cogwirrel рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ lodash . рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

import { pluralize } from '...'

export function humanize (duration) {
  const durationComponents = [
    { value: duration.years(), unit: 'year' },
    { value: duration.months(), unit: 'month' },
    { value: duration.days(), unit: 'day' },
    { value: duration.hours(), unit: 'hour' },
    { value: duration.minutes(), unit: 'minute' },
    { value: duration.seconds(), unit: 'second' },
    { value: duration.milliseconds(), unit: 'millisecond' }
  ]
  return durationComponents
    .filter(({ value }) => value !== 0)
    .slice(0, 3)
    .map(({ unit, value }) => pluralize(value, unit))
    .join(', ')
}

+1

(рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдорд╛рдирд╡рдХрд░рдг() рд╡рд┐рдзрд┐ рд╣реЛрдЧреА, рддреЛ "1.51 рдШрдВрдЯреЗ" рдХреЛ "2 рдШрдВрдЯреЗ" рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╛рдирд╡-рд╡рд╛рдИ рдирд╣реАрдВ рд╣реИ)ред

+1
рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрддрдиреА рдмрдбрд╝реА рд╡рд┐рд╡рд┐рдзрддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ Moment.js рдХрд░рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ!

+1

+1

+1

+1

рдкреАрдПрд╕ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдпрд╣ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ ;(

+1 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЕрднреА рднреА рдпрд╣рд╛рдБ рдирд╣реАрдВ рд╣реИ ?!

рдореИрдВ рдЕрдВрдд рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдпрд╣ рд▓рдЧрднрдЧ 7 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╣реА рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдЦрд┐рд░рдХрд╛рд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЙрди рд╕рднреА +1 рдХреЗ рд╕рд╛рде рдерд╛)

рдореБрдЭреЗ рдПрдХ рдкреИрдХреЗрдЬ рдорд┐рд▓рд╛ рдЬреЛ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИ
https://github.com/EvanHahn/HumanizeDuration.js

рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реИред

+1

+1

+1

+1

рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░:

const units: Array<{unit: moment.unitOfTime.Base, key: moment.RelativeTimeKey}> = [
  {unit: 'y', key: 'yy'},
  {unit: 'M', key: 'MM'},
  {unit: 'd', key: 'dd'},
  {unit: 'h', key: 'hh'},
  {unit: 'm', key: 'mm'},
  {unit: 's', key: 'ss'},
];
function accurateHumanize(duration: moment.Duration, accuracy: number = 2): string {
  let beginFilter = false;
  let componentCount = 0;

  return units
    .map(({unit, key}) => ({value: duration.get(unit), key}))
    .filter(({value, key}) => {
      if (beginFilter === false) {
        if (value === 0) {
          return false;
        }
        beginFilter = true;
      }
      componentCount++;
      return value !== 0 && componentCount <= accuracy;
    })
    .map(({value, key}) => ({value: value, key: value === 1 ? key[0] as moment.RelativeTimeKey : key}))
    .map(({value, key}) => moment.localeData().relativeTime(value, true, key, true))
    .join(', ');
}

рдпрд╣ рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рдПрдХ рдЕрд╡рдзрд┐ рдХреЗ рд╕рдЯреАрдХ рд╕реНрд╡рд░реВрдкрдг рдХреЛ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

рдЧреЛрд▓ рдХрд┐рдП рдмрд┐рдирд╛ рдорд╛рдирд╡реАрдХрд░рдг рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ
+1

рдЗрд╕ рдкрд░ +1

+1

+1

+1

+1

рдЕрдЧрд░ рдХреЛрдИ рдЧреБрдЧрд▓реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣рд╛рдВ рдЙрддрд░рддрд╛ рд╣реИ, рддреЛ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди/рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдкрд░реНрдпрд╛рдкреНрдд рдерд╛:

moment.relativeTimeRounding((t) => {
  const DIGITS = 2; // like: 2.56 minutes
  return Math.round(t * Math.pow(10, DIGITS)) / Math.pow(10, DIGITS);
});
moment.relativeTimeThreshold('y', 365);
moment.relativeTimeThreshold('M', 12);
moment.relativeTimeThreshold('w', 4);
moment.relativeTimeThreshold('d', 31);
moment.relativeTimeThreshold('h', 24);
moment.relativeTimeThreshold('m', 60);
moment.relativeTimeThreshold('s', 60);
moment.relativeTimeThreshold('ss', 0);

console.log(moment.duration(89, 's'));
// Output: "1.48 minutes"
// тАж without configuring the moment.relative*(), output was: "a minute"

рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдЯреАрдХрддрд╛ рдПрдХ рдЕрдЪреНрдЫреЗ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдкрд╛рда рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЙрддреНрддрд░ рдпрд╣ moment.relative*() рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░/рдЖрд╣реНрд╡рд╛рди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдПрдХ рддреБрд▓рдирд╛ рд╣реИ:

| рдЕрд╡рдзрд┐ | рдкрд╣рд▓реЗ | рдХреЗ рдмрд╛рдж |
| ------------- | --------------- | -------------- |
| 3s | a few seconds | 3 seconds |
| 44s | a few seconds | 44 seconds |
| 45s | a minute | 45 seconds |
| 1m 29s | a minute | 1.48 minutes |
| 1m 30s | 2 minutes | 1.5 minutes |
| 1m 59s | 2 minutes | 1.98 minutes |
| 44m | 44 minutes | 44 minutes |
| 45m | an hour | 45 minutes |
| 1h 29m | an hour | 1.48 hours |
| 1h 30m | 2 hours | 1.5 hours |
| 21h | 21 hours | 21 hours |
| 22h | a day | 22 hours |
| 35h | a day | 35 hours |
| 35h 30m | a day | 35.5 hours |
| 36h | 2 days | 36 hours |

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

IbraheemAlSaady picture IbraheemAlSaady  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alvarotrigo picture alvarotrigo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

benhathaway picture benhathaway  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ninigix picture ninigix  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nikocraft picture nikocraft  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ