рдЬрдм рд╕реЗрдХрдВрдб рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ .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"
рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ ?
@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 рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛:
рд╣реЗ рдлреНрд░реИрдВрдХ, рдореИрдВ рджреЛрдкрд╣рд░ рдХрд╛ рднреЛрдЬрди рд▓реЗрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдЧрд▓реА рдмреИрдардХ рддрдХ рдХрд┐рддрдирд╛ рд╕рдордп рд╣реИ?
рдПрдХ рдШрдВрдЯрд╛
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.
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 рдорд┐рдирдЯ рдХреЗ рдЕрдВрддрд░ рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдШрд░ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реВрдВ, рдпрд╛ рдореБрдЭреЗ рдкрд╛рд╕ рдореЗрдВ рдХреБрдЫ рд▓реЗрдирд╛ рд╣реИред
@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
|
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╕рдЯреАрдХ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ: 3 рдШрдВрдЯреЗ рдФрд░ 3 рд╕реЗрдХрдВрдбред