Moment: рдЕрд╡рдзрд┐ рдЧрд╛рдпрдм рд╕реБрд╡рд┐рдзрд╛рдПрдБ

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

рдореИрдВ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдХреНрд╖рдгрд┐рдХрд╛рдПрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреЗрдЯ рд╣реЗрд░рдлреЗрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЖрдкрдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╣рд╡рд╛рдИ рдЬрд╣рд╛рдЬ рдХреЗ рдЯрд┐рдХрдЯ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреА рджреБрдХрд╛рди рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред duration.humanize() рдлрд╝рдВрдХреНрд╢рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрдВрдкреНрд░реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрдм 12:00 рдкрд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ рдФрд░ 13:30 рдкрд░ рдЙрддрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕реЗ 2 рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЙрдВрдб рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреА рдЧреНрд░реИрдиреНрдпреБрд▓реИрд░рд┐рдЯреА рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬреЛ рдкрд▓-рдкрд▓ рдЧрд╛рдпрдм рд╣реИред

рдЙрдЪреНрдЪрддрдо рдореВрд▓реНрдп рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ 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. рд╣реЛрддреА рд╣реИред рдореЛрдореЗрдВрдЯреЗрдЬ рдЗрд╕рдХрд╛ "рдХреБрдЫ рд╕реЗрдХрдВрдб" рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рдХреА рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

// 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

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрдЪреНрдЪрддрдо рдореВрд▓реНрдп рдХреЛ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ 1 рд╡рд░реНрд╖ рднреА рд╣реИ, рддреЛ рдкреНрд░рд╛рд░реВрдк рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрдиреЗ рдкрд░ рдЦреБрд╢реА рдордирд╛рдКрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ рдФрд░ рдЬрдм рд╣рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЛ рдЦрд░рд╛рдм рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рд╣рд╛рде рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

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

2019, рдЕрднреА рднреА рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИред

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

рдЗрд╕ рдЕрдиреБрд░реЛрдз рдкрд░ +1

@llacroix , рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд▓реЗрдВрдЧреЗ?

рд╣рд╛рдБ рд╢рд╛рдпрдж, рдореИрдВ рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред рдЗрд╕реЗ рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡рддрдГ рд▓рдВрдмреЗ рд╕рдордп рдореЗрдВ рдЦреБрдж рдХреЛ рдФрд░ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рдордп рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ рдореБрдЭреЗ рд╣рд░ рдЬрдЧрд╣ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рдХреА рдЧрдВрджрдЧреА рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдХреНрд╖рдгреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╢рд╛рдпрдж рдереЛрдбрд╝рд╛ рдФрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдкреНрд░рд╛рд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 0 рдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред

4 hours 20 seconds рдпрд╛ 0 days 4 hours 0 minutes 20 seconds

рдорд╣реАрдиреЗ 30 рджрд┐рди, рдПрдХ рд╕рд╛рд▓ 365 рд╣реЛрдВрдЧреЗред

рдФрд░ рд╡рд░реНрд╖, рдорд╣реАрдиреЗ, рд╕рдкреНрддрд╛рд╣, рджрд┐рди, рдорд┐рдирдЯ, рджреВрд╕рд░реЗ рдФрд░ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдХреМрди рд╕реЗ рдкреНрд░рд╛рд░реВрдк рдореМрдЬреВрдж рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рдХреЗ рд▓рд┐рдП +1
рд▓реЗрдХрд┐рди рд╣рд╛рдБ, рд╕реНрд╡рд░реВрдкрдг рдпрд╣рд╛рдБ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ рд╣реИред рдорд╛рдирд╡реАрдХрд░рдг рдФрд░ рдкреНрд░рд╛рд░реВрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рджреЛрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдорд╛рдирд╡реАрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрдЭрд╛рд╡:
// 1:30
duration.humanize ();
1 рдШрдВрдЯрд╛ 30 рдорд┐рдирдЯ
рдЕрд╡рдзрд┐ред рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ ({рджреМрд░: "рдШрдВрдЯреЗ"})
2 рдШрдВрдЯреЗ
рдЕрд╡рдзрд┐ред рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ ({рджреМрд░: "рдорд┐рдирдЯ"})
1 рдШрдВрдЯрд╛ 30 рдорд┐рдирдЯ
рдЕрд╡рдзрд┐.рд╕рдорд░рдг ({рджреМрд░: "рд╕реЗрдХрдВрдб"})
1 рдШрдВрдЯрд╛ 30 рдорд┐рдирдЯ 0 рд╕реЗрдХрдВрдб

рдпрджрд┐ рдЧреЛрд▓ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдЪреНрдЪрддрдо рдПрдХрддрд╛ рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп рд╢реВрдиреНрдп рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдЫреЛрдЯреА рд╕рднреА рдЗрдХрд╛рдЗрдпрд╛рдВ рдЫреЛрдбрд╝реА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

// 1 рдШрдВрдЯрд╛ 0 рдорд┐рдирдЯ 45 рд╕реЗрдХрдВрдб
рдЕрд╡рдзрд┐.рдорд╛рди () -> 1 рдШрдВрдЯрд╛
// 1 рдШрдВрдЯрд╛ 1 рдорд┐рдирдЯ 0 рд╕реЗрдХрдВрдб
рдЕрд╡рдзрд┐ред рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ () -> 1 рдШрдВрдЯрд╛ рдФрд░ 1 рдорд┐рдирдЯ
// 1 рдШрдВрдЯрд╛ 1 рдорд┐рдирдЯ 10 рд╕реЗрдХрдВрдб
рдЕрд╡рдзрд┐ред рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ () -> 1 рдШрдВрдЯрд╛ 1 рдорд┐рдирдЯ рдФрд░ 10 рд╕реЗрдХрдВрдб

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, "рдФрд░" рд╡рд┐рднрд╛рдЬрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдВрддрд┐рдо рдЬреБрдбрд╝рд╛рд╡ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрд╡рд╡рд░реНрддреА рд╣реИ
2 рдорд╣реАрдиреЗ 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 рдорд╛рди рджрд┐рдЦрд╛рдП рдЧрдП рдереЗ рдпрд╛ рдирд╣реАрдВ?

рд╕реАрдПрд▓рдбреАрдЖрд░ рдореЗрдВ рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рд░реВрдкрдг рдпреЛрдЬрдирд╛ рдФрд░ рдбреЗрдЯрд╛ рд╣реИ, рдЬреЛ рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдЕрднреА рднреА рдХрд╕реНрдЯрдо рдХреЙрд▓рдмреИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

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' рдЬреИрд╕реЗ рдХреНрд░рдо рдореЗрдВ рдирд╣реАрдВ рдереЗред рдпрд╣ рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдХрд╛рдо рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рддрд░рд╣ рдХреА рдЪреАрдЬ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЙрдореНрдореАрдж рдереА!

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред

рдЗрд╕рдХреА рдЬрд░реВрд░рдд рд╣реИ!

рдЖрдк рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдЯреЙрдкрдЧреИрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рд╕рд░рд▓ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЙрд▓рдЯреА рдЧрд┐рдирддреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕реАрдзреЗ рдореЛрдореЗрдВрдЯ рд╕реЗ:

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.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"

рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ:

  • asXxxx рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдпреЛрдВ рдкрд░ Math.floor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ:
Math.floor(moment.duration(milliseconds)).asHours()
  • рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдпрджрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрд╡рдзрд┐ рдореЗрдВ рдорд┐рдирдЯ рдпрд╛ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░реВрдк рдлрд╝рдВрдХреНрд╢рди рдкреВрдЫрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЧреЛрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдпрд╣ рд╣рдореЗрд╢рд╛ рдиреАрдЪреЗ рд╣реЛрдЧрд╛ред

рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП +1

рд╡реНрдпрдХреНрддрд┐рдЧрдд рддреМрд░ рдкрд░ рдореИрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ .format() рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдлреИрдВрд╕реА рдирд┐рдпрдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд┐рдзрд┐ .humanize() рдпрд╛ рдПрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП .countdown() рд╡рд┐рдзрд┐ред 95% рдореБрджреНрджреЛрдВ рдХреЛ .format() рд╕рд╛рде рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ .humanize() рдХреЛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХрддрд╛ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдЕрд╡рдзрд┐ рдПрдХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рддреИрдпрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╕реЗрдХрдВрдб рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдХрдареЛрд░ рдХреЛрдб рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди:
d = moment.duration ({рджрд┐рди: 1, рдШрдВрдЯреЗ: 1, рдорд┐рдирдЯ: 1}); d.format ( 'DH: mm: ss');
"1 -215: 01: 00"

+1 format()

рдПрдХ usecase рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдордп рдкрд░реАрдХреНрд╖рд╛ (3 рдШрдВрдЯреЗ) рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА Durations рдХреЛ hh: mm (: ss) рдпрд╛ рддреЛ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рдЕрднреА, рдореЛрдореЗрдВрдЯ рдореЗрдВ рд╡реИрд╕рд╛ рд╣реА рдХрд░рдирд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рд╡реИрдирд┐рд▓рд╛ рдЬреЗрдПрд╕ рдореЗрдВ рдбрдм рдирд╣реАрдВ рдХрд░реВрдВрдЧреА :)

+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: period.format () рдХреЗ рд▓рд┐рдП рднреА

рдЗрд╕ рдкреАрдЖрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рджреВрд░ рд╣реИ?

Code Bounty

рдореИрдВ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рджреВрд░ рд╣реЛ рдЧрдпрд╛ ... рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдЬреЛ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдирд╛рдпрд╛ред рдореИ рдЙрд╕реЗ рдХрд░рдиреЗ рдХреА рдПрдХ рдХреЛрд╢рд┐рд╢ рддреЛ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдкрд▓ рдкрд▓ js рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреИрд╕реЗ рд╣реА рдореЗрд░реЗ рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдг / рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рджреЛ рджрд┐рдиреЛрдВ рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рджреЛ рджрд┐рдиреЛрдВ рдХреЗ рднреАрддрд░ рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореИрдВ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

@llacroix рдзрдиреНрдпрд╡рд╛рдж :)

: +1: рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдПред рд╕реБрдзрд╛рд░ ()

 рдХреНрд╖рдгред рдЕрд╡рдзрд┐ редfn.format = рдлрд╝рдВрдХреНрд╢рди (рд╢реВрдиреНрдп, рджреЛрдбрд┐рдЯ) {
 var рдШрдВрдЯреЗ = this.hours (), рдорд┐рдирдЯ = this.minutes (), рд╕реЗрдХрдВрдб = this.seconds ();
 var displayFormat = '', zerosFormat = twoDigit? '00': '0', рдкреИрдбрд▓реЗрдлреНрдЯ = рдЯреВрдбрд┐рдЬрд┐рдЯ? -2: -1;
 рдЕрдЧрд░ (рдШрдВрдЯреЗ || рд╢реВрдиреНрдп) {
 displayFormat + = (zerosFormat + hours) .slice (padLeft) + 'h';
 }
 рдЕрдЧрд░ (рдорд┐рдирдЯ || рд╢реВрдиреНрдп) {
 displayFormat + = (zerosFormat + рдорд┐рдирдЯ) .slice (рдкреИрдбрд▓реЗрдлреНрдЯ) + 'рдорд┐рдирдЯ';
 }
 рдЕрдЧрд░ (рд╕реЗрдХрдВрдб || рд╢реВрдиреНрдп) {
 DisplayFormat + = (zerosFormat + seconds) .slice (padLeft) + 's';
 }
 рд╡рд╛рдкрд╕реА $ .trim (displayFormat);
 }

+1 рдЕрд╡рдзрд┐ рдкреНрд░рд╛рд░реВрдкред

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рдЕрд╡рдзрд┐ рдХреЗ рдкреНрд░рд╛рд░реВрдкрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдФрд░ рд╕реНрдЯреИрдХрдСрд╡рд░рдлрд╝реНрд▓реЛ рдкрд░ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреА рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЬ рдмреИрда рдЧрдпрд╛ред

рдореИрдВ рдЕрднреА рднреА рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдареЛрд╕ рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рдЕрдЧрд▓реЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдХреЛрдб рдФрд░ рдХрд▓реНрдкрдирд╛ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рдорд┐рд▓реЗрдВрдЧреЗред рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рднреА рдордирдорд╛рдирд╛ рдЕрд╡рдзрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХреНрд╖рдг рдкреНрд░рд╛рд░реВрдк рдкреНрд░рд╛рд░реВрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЬреИрд╕реЗред period.format ("d [d] hh: mm: ss") -> 2d 03:47:24

рдЖрдк рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдкрд░ рдордирдорд╛рдиреА рджрд╢рдорд▓рд╡ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗред period.format ("h [hrs]", 3) -> 42.384 hrs

рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП +1.рдлреЙрд░реНрдореЗрдЯ

рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдХреНрд╖рдг рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред
https://github.com/jsmreese/moment-duration-format

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

+1 рдЕрд╡рдзрд┐.рдлреЙрд░реНрдореЗрдЯ ()

рдпрд╣ рдЯрд┐рдХрдЯ рдЕрдм рд╕реЗ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЦреЛрд▓рд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрднреА рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

@ Maxwell2022 рдореИрдВрдиреЗ рдПрдХ рдкрд▓ рдкрд╣рд▓реЗ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдерд╛ред рд╕реБрдзрд╛рд░ рдкреНрд▓рдЧрдЗрди рдПрдХ рд╣рдлреНрддреЗ рдкрд╣рд▓реЗ рдпрд╛ рддреЛ:
https://github.com/jsmreese/moment-duration-format

рдХреНрдпрд╛ рд╡рд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛?

рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА +1 рднреАред рдЕрдиреНрдпрдерд╛ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдмрд╣реБрдд рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдЪреВрдХ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

https://github.com/rmm5t/jquery-timeago рдЗрд╕ рдмрд╛рдд рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЦрд╛рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдореЛрдореЗрдВрдЯ рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ...

@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 рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рд┐рдЪ рдХрд╛ рдФрдЪрд┐рддреНрдп рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдпрджрд┐ рдЖрдкрдХрд╛ рдкреНрд▓рдЧрдЗрди рджреЛрдиреЛрдВ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдерд╛, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдзрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ред

@ рд╡реНрд╣реЗрд▓реНрдкрд░ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣рдордд рд╣реИрдВред

рдореЗрд░рд╛ рд╡рд╛рддрд╛рд╡рд░рдг LoDash рдФрд░ Underscore.String рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ - рдореБрдЭреЗ рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдФрд░ рдмрд╕ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдореИрдВ рдЙрди рдЖрд╢реНрд░рд┐рддреЛрдВ рдХреЛ рд╢реАрдШреНрд░ рд╣реА рд╣рдЯрд╛ рджреВрдБрдЧрд╛ред

@ рд╕реНрд▓реАрдкрд░ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдФрд░ LoDash рдЗрдВрдЯрд░рдХрдореНрдкреИрдЯрд┐рдмрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рддрдХ @jsmreese LoDash рдХреЗ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдмрд┐рд▓реНрдб рдореЗрдВ рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддрдм рддрдХ рдЖрдкрдХреЛ рдЙрд╕рдХреЗ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░реЗрд╢рд╛рдиреА рдХреЗред

@ input8908 рдпрд╣ рдмрд╛рдд рд╣реИ, рдФрд░ @wleeper рд╕рд╣реА рд╣реИ - рдореИрдВ _am_ LoDash рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдмрд┐рд▓реНрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВред

рдореИрдВрдиреЗ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИред рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдХрдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╕рдВрдЧрддрддрд╛ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкрд▓-рдЕрд╡рдзрд┐-рдкреНрд░рд╛рд░реВрдк рдкреНрд▓рдЧрдЗрди рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ # 1241 рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдорд╛рдирд╡-рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рддрд┐рдерд┐рдпреЛрдВ, рддрд┐рдерд┐рдпреЛрдВ, рдФрд░ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рджрд░рд╡рд╛рдЬреЗ рдЦреЛрд▓реЗрдВрдЧреЗред formatDuration рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реЛрдЧрд╛ рдпрджрд┐ рдкрд▓ рдореЗрдВ CLDR рднрд╛рд╖рд╛ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛред

jQuery рдХрд╛ Globalize рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдорд╛рди рдореБрджреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдХрдИ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рд╕рд╣рдпреЛрдЧ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИред рдЯреНрд╡рд┐рдЯрд░ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВ рдХрд░рддрд╛ рд╣реИ ...

рдареАрдХ рд╣реИ, рдпрд╣рд╛рдБ 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
})
  • рдиреНрдпреВрдирддрдо: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдЗрдХрд╛рдИ рдХреНрдпрд╛ рд╣реИред рдорд┐рдирдЯ: рджрд┐рди, рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдШрдВрдЯреЗ, рдорд┐рдирдЯ, рд╕реЗрдХрдВрдб рдордд рдХрд╣реЛ, рд▓реЗрдХрд┐рди рдпрджрд┐ рджрд┐рди рдПрдХ рджрд┐рди рд╕реЗ рдХрдо рд╣реИ рддреЛ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреЛрд▓
  • рдЕрдзрд┐рдХрддрдо: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдЗрдХрд╛рдИ рдХреНрдпрд╛ рд╣реИред рдЕрдзрд┐рдХрддрдо: рджрд┐рди, рдХрд╛ рдЕрд░реНрде рд╣реИ рдорд╣реАрдиреЛрдВ рдФрд░ рд╡рд░реНрд╖реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдирд╛, рдмрд▓реНрдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рджрд┐рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛
  • рд▓рдВрдмрд╛рдИ: рдЯреЛрдХрди рдХрд╛ рдЖрдХрд╛рд░: рджрд┐рди рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЗ рд▓рд┐рдП рдмрдирд╛рдо
  • abs: рднрд╡рд┐рд╖реНрдп / рдЕрддреАрдд рд╕реНрд╡рддрдВрддреНрд░

: +1: +1

: +1:

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░

+1

+1

+1

рдХреБрдЫ рдХреЗ рд░рдирдЯрд╛рдЗрдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред

+1

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

рдкрд▓-рдЕрд╡рдзрд┐-рдкреНрд░рд╛рд░реВрдк рд╕рдВрд╕реНрдХрд░рдг 1.2.1 рдПрдирдкреАрдПрдо рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдЖ рд╣реИред
рдпрд╣ Node.js рдФрд░ Browser рджреЛрдиреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИред
рдпрд╣ рд▓реЛ-рдбреИрд╢ рдпрд╛ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИред
рдореВрд▓ рдЕрдВрдбрд░рд╕реНрдХреЛрд░.рдЯреНрд░рд┐рдВрдЧ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЬреИрд╕реЗ рд╣реА рд╡рд░реНрддрдорд╛рди рдмреЛрд╡рд░ рдкреИрдХреЗрдЬ рд░рдЬрд┐рд╕реНрдЯрд░ / рдЕрдкрдВрдЬреАрдХреГрдд рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмреЛрд╡рд░ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рджреВрдВрдЧрд╛ред

рдЕрд╡рдзрд┐ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП +1

рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред

+1

+1

+1

: +1:

рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП +1.рдлреЙрд░реНрдореЗрдЯ ()

+1

рдУрд╣ рд╣рд╛рдБ, рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдЧреНрд░рдгреА рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП moment.duration(3, 'seconds').get('ss') рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдЕрдВрджрд░ рд░рд╣реВрдВрдЧрд╛ред

рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ? рдЙрд╕ рдкрд░ рдкреНрд░рдЧрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдорджрдж рдЪрд╛рд╣рд┐рдП?

@oncletom
рдпрд╣ рдореМрдЬреВрдж рд╣реИ: https://github.com/jsmreese/moment-duration-format/
рдФрд░ рдХреНрдпрд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдЖрдк рд▓реЛ-рдбреИрд╢ рдпрд╛ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдмреБрд░рд╛ рдирд╣реАрдВ рдорд╛рдирддреЗ рд╣реИрдВред
рдХрд┐рд╕реА рджрд┐рди рдЬрд▓реНрдж рд╣реА рдореИрдВ рдЙрд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рджреВрдВрдЧрд╛ ...

рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ https://github.com/jsmreese/moment-duration-format/ рдЬрдм humanize рд╣реИ, рддреЛ stdlib рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрддрд╛ рд╣реИред рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

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

рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

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

рдХреНрд╖рдгреЛрдВ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд▓реНрдж рд╣реА рдЗрд╕реЗ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред js

+1

+1

рд╕рдВрдмрдВрдзрд┐рдд рдиреЛрдЯ рдкрд░, duration.toString() [Object object] рд░рд┐рдЯрд░реНрди рдорд┐рд▓рддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ humanize() рдирд╣реАрдВ рд▓реМрдЯрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

+1 рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдЧрд╛ред

+1

рдмрд╕ рдореЛрдореЗрдВрдЯ рдбреНрдпреВрд░реЗрд╢рди рдкреНрд░рд╛рд░реВрдк 1.3.0 рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд▓реЛ-рдбреИрд╢ рдпрд╛ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдкрд░ рдкрд┐рдЫрд▓реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИред рдЕрдм рдХреЗрд╡рд▓ рдирд┐рд░реНрднрд░рддрд╛ Moment.js рд╣реА рд╣реИред

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

@jsmreese рдЕрдЪреНрдЫрд╛ рдЖрджрдореА! :рдмрд┐рдпрд░:

@ рдЬрдЬрд╝реАрд░реЗрд╕ рдХреВрд▓ред !
рдпрд╣ рдХреНрд╖рдг рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИред рдЦреБрдж рд╣реА, рдореБрдЭреЗ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдорд╛рдирд╡реАрдХрд░рдг рд╕рдЯреАрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЗрддрдирд╛ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рдореИрдВ 1 рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП 30 рдШрдВрдЯреЗ рдФрд░ 30 рдорд┐рдирдЯ рдХреЗ рдЪрдХреНрдХрд░ рдХреНрдпреЛрдВ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛? .. рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИред

+1, jsmreese рджреНрд╡рд╛рд░рд╛ рдкреНрд▓рдЧрдЗрди рд╢рд╛рдирджрд╛рд░ рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдХреНрд╖рдг рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддрд╛ рддреЛ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ред jsред

+1ред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрдВрджрд░ рдФрд░ рдмрд╛рд╣рд░ рдорд╛рдирд╡реАрдХреГрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП +1.рдлреЙрд░реНрдореЗрдЯ

@jsmreese рдиреЗ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рдкреНрд▓рдЧрдЗрди рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рдореБрджреНрджрд╛ рджреЛ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЦреЛрд▓рд╛ рдЧрдпрд╛ рдерд╛ред @timrwood @ichernev рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдореБрдЦреНрдп рдХреНрд╖рдг рдореЗрдВ

+1

+1

: +1: period.format рдХреЗ рд▓рд┐рдП

+1

: +1:

+1

рдЗрд╕рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ?

рд╢рд╛рдпрдж рдЕрдиреБрдЪрд░ рд╣рдореЗрдВ резрежрежреж, рдпрд╛ рдирдП рд╕рд╛рд▓ рдХреА рдкреВрд░реНрд╡ рд╕рдВрдзреНрдпрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ? @icambron

@gkatsanos - рдореИрдВ рдореЛрдореЗрдВрдЯ (рдФрд░ рдореИрдВ рд╣рдореЗрд╢рд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╣рд╛рдпрдХ рдерд╛) рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЕрдиреБрд░реЛрдз рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдИ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред

@icambron рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкреНрд▓рдЧрдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдореМрдЬреВрдж рд╣реИ .. рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?
рдХреМрди рдЕрдиреБрд░рдХреНрд╖рдХ btw рд╣реИ?

@icambron рдХреНрдпрд╛ рдЖрдк рдкреНрд▓рдЧрдЗрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдФрд░ рдпрд╣ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЖрдХрд╛рд░ рдХрд╛ рдкреНрд▓рдЧрдЗрди рд▓рдЧрддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рд╕рд┐рд╡рд╛рдп lodash рдХреЗ рдмрдЬрд╛рдп underscore , рд╡рд╣рд╛рдБ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдкреАрдЖрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЛрдХрдиреЗ рдХреЗ рд╣реИрдВ .. рд╕реЗ рдмрдВрджрд░рдЧрд╛рд╣ рд╣реЛ рд░рд╣рд╛ рд╣реИ lodash рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП underscore рдЙрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред / cc @jsmreese

@alexanderbeletsky @gkatsanos рдЕрд╕рд▓ рдореЗрдВ рдореИрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ lodash рдпрд╛ underscore рдирд┐рд░реНрднрд░рддрд╛ рдереЛрдбрд╝реА рджреЗрд░ рдкрд╣рд▓реЗред

Moment.js рдХреЛрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдореЗрд░реЗ рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП рдкреНрд░рдореБрдЦ рдмрд╛рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкреВрд░реНрдг i18n рд╕рдорд░реНрдерди рдХреА рдХрдореА рд╣реИред

рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рд╣реИ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗред рд╕рдорд░реНрдерд┐рдд рдХрдИ рднрд╛рд╖рд╛рдПрдБ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝реА рдмрд╛рдд рд╣реИрдВ, рдФрд░ рдореИрдВ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдиреЗ рд╕реЗ рдирдлрд░рдд рдХрд░реВрдБрдЧрд╛ рдЬрд╣рд╛рдБ рдлрд╝реАрдЪрд░ A рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реЛ, рд▓реЗрдХрд┐рди рдлрд╝реАрдЪрд░ B рдХреЗрд╡рд▓ рдЕрдВрдЧреНрд░реЗрдЬрд╝реА рдореЗрдВ рд╣реИред

@jsmreese рд╢рд╛рдпрдж рдЕрдЧрд░ рдЖрдкрдХреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдХреБрдЫ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдп рдмрдирд╛рдПрдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

@mattgrande @alexanderbeletsky рдкреНрд░рд╛рд░реВрдк рдЯреЛрдХрди рдЕрдиреБрдХреВрд▓рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рд╛рд░реВрдк рдЯреЗрдореНрдкрд▓реЗрдЯ, рдордирдорд╛рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╛рд░реВрдк рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЖрдк рджрд╢рдорд▓рд╡ рдмрд┐рдВрджреБ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╕реНрд╡рд░реВрдкрдг рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╣ рд╕рдм рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рдЧрд╛рдпрдм рд╣реИред

: +1:

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░!

sooo .... рд╡рд╛рдЯ рдЗрд╕ рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рд╣реИ?

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

  1. рд╣рд░ рдХреЛрдИ, рдЖрдк рд╕рд┐рд░реНрдл @jsmreese рдХреЗ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рджрд┐рдЦрддрд╛ рд╣реИ! рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЕрдЪреНрдЫреА рдЪреАрдЬреЗрдВ рд╣реИрдВ! ( @jsmreese , рдпрджрд┐ рдЖрдк рдмрд╣реБрдд рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдПрдХ рдкреАрдЖрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдореЛрдореЗрдВрдЯ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/moment/momentjs.com)
  2. рдпрд╣ рддрдм рддрдХ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЗрд╕рдХрд╛ a) рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдирд╣реАрдВ рдХрд░ рджреЗрддрд╛ рд╣реИ, b) рдХреНрд╖рдгреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ c) PR рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддрдм рддрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХреЛрдИ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ ред

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░!

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░ред рд╣рдорд╛рд░рд╛ рдорд╛рдорд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреБрдЫ рд╕реЗрдХрдВрдб рдФрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░реЗрдЧрд╛ред рдЕрднреА рд╣рдо рдЗрд╕реЗ moment.startof ("w") рдХреЗ рд╕рд╛рде рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЬреЛрдбрд╝реЗрдВ ("s", nrOfececonds) редformat (customFormatString);

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЕрднреА рдкрд┐рдЫрд▓реЗ рд╕рдкреНрддрд╛рд╣ рд╣реА рдЗрд╕рдиреЗ рд╕реНрдЯрд╛рд░реНрдЯрдСрдл ("w") рдХреЗ рдмрд╛рдж рд╕реЗ рд░рд╡рд┐рд╡рд╛рд░ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХреА рдФрд░ рд░рд╡рд┐рд╡рд╛рд░ рдХреЛ рджрд┐рди рдХреЗ рд╕рдордп рдХреА рдмрдЪрдд рдХрд╛ рд╕рдордп рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡рд╣рд╛рдВ рдПрдХ рдШрдВрдЯреЗ рд╕реЗ рдЧрд╛рдпрдм рдереЗред рдмреЗрд╢рдХ рд╣рдо рдпрд╣ рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ isDSTShifted () рдХреЗ рд╕рд╛рде рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЗрд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╡рдзрд┐ рдХреЛ рдПрдХ рддрд╛рд░реАрдЦ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░

+1 duration.format

рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП +1.рдлреЙрд░реНрдореЗрдЯ

рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рдмрдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ + 1ing рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ?

рдмреБрдз рдкрд░, рдЬреВрди 10, 2015, 08:30 SamFromDaUk рд╕реВрдЪрдирд╛рдПрдВ @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП +1.рдлреЙрд░реНрдореЗрдЯ

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/moment/moment/issues/463#issuecomment -110751635

рдпрд╛, рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВ?

рдЬреЙрд░реНрдЬ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЛ рд▓реЛрдЧ +1 рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ рд╡реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд╕рд╣рдордд рд╣реИрдВ, рдФрд░
рдмрд╕ рдпреЗ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ рд╕реВрдЪрдирд╛рдПрдБ рдЖрдкрдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░ рд░рд╣реА рд╣реИрдВ, рддреЛ рдЗрд╕ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
рдереНрд░реЗрдбред
11 рдЬреВрди 2015 00:07 рдХреЛ, "рдЬреЙрд░реНрдЬ рдХреИрдЯрд╕рдиреЛрд╕" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдпрд╛, рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВ?

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/moment/moment/issues/463#issuecomment -110767322ред

рд╕рдВрдкреВрд░реНрдг рдХрд╛рд░рдг рдЧрд┐рддреБрдм рдореЗрдВ рдПрдХ рд╡реЛрдЯ рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рд╣реИ (рдореЗрд░реА рд╕рдордЭ рд╕реЗ) рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЪрд░реНрдЪрд╛ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред

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

рдореИрдВ рдЕрднреА рднреА рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рд╣реБрдЖ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ _do_ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реНрдХ рджрд┐рдП рдЬрд╛рдиреЗ рдмрд╛рдХреА рд╣реИрдВ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЯреАрдо рдХреЛ рдХреЗрд╡рд▓ рджрдмрд╛рд╡ рдореЗрдВ рдЭреБрдХрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди @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 ()ред format () рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: https://github.com/jsmreese/moment-duration-format

рдпрджрд┐ рдЖрдк рдЙрд▓реНрдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ oaf:moment-duration-format

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рдкрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рджреЛ рд╕рдордп рдХреЗ рдмреАрдЪ .iff, рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ "рджреЛрдкрд╣рд░" рдФрд░ "рд╣реВрдБ" рдХреЗ рдмреАрдЪ рд╣реИ, рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ 9pm рдкрд░ рдпрд╛рддреНрд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдФрд░ рд▓реИрдВрдбрд┐рдВрдЧ 2am, рдореБрдЭреЗ рд╕рдордп рдХреА рд╕рд╣реА рдорд╛рддреНрд░рд╛ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдПред

@ Markj89 рдЖрдкрдХреЛ

+1

+1

+1

: +1:

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдкрд░ +1ред рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдареЛрд╕ рд╕рдорд╛рдзрд╛рди рд╣реИред

+1

+1

+1 .format()

+1, рдЕрднреА рднреА 4 рд╕рд╛рд▓ рдмрд╛рдж рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? : рдбреА

+1

Btwред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдирд╡рдХреГрдд рдкреНрд░рд╛рд░реВрдк рдХреЛ рднреА рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреИрд╕реЗ рдХрд┐ 7 days and 5 hours рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЙрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ ...

рдмрд╕ @jsmreese рдХреЗ рдкреНрд▓рдЧрдЗрди рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд╛рдо рдорд╣рд╛рди!

: +1:

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░

+1 рдЕрд╡рдзрд┐ рдкреНрд░рд╛рд░реВрдк

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░

: +1:

рдореИрдВ рдЗрд╕реЗ # 1048 рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЪрд▓реЗ рдЧрдП рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд┐рд░реНрдл рджреЛ рдореБрджреНрджреЗ рд╣реИрдВ рдЬреЛ рдХрдИ рд╕рд╛рд▓ рдкреБрд░рд╛рдиреЗ рд╣реИрдВ рдФрд░ рджреЛрдиреЛрдВ 'рдЕрд╡рдзрд┐ рд╕реНрд╡рд░реВрдкрдг' рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдмрд▓рддреЗ рд╣реИрдВред рдЕрдиреНрдп рд╡реНрдпрдХреНрддрд┐ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛рддрд╛ рд╣реИред

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░

+1 рдЕрд╡рдзрд┐ред рд╕реБрдзрд╛рд░

+1

.LocaleData () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╕рдВрдмрдВрдзрд┐рдд рд╕рдордп (45, рд╕рдЪ, 'рдорд┐рдореА') рдФрд░ 45 рдорд┐рдирдЯ, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ;)

+1 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрднреА рддрдХ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ https://github.com/jsmreese/moment-duration-format рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рд╣реИ

рдХрд┐рд╕реА рднреА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрд╡рдзрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЕрд╡рдзрд┐ рдХреЛ рдПрдордПрд╕ рдФрд░ рдлрд┐рд░ рдХреНрд╖рдг рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ:
moment(duration.as('milliseconds')).format('HH:mm:ss')

рдзрдиреНрдпрд╡рд╛рдж! рдХреНрдпрд╛ рдпрд╣ рдбреЙрдХреНрд╕ рдореЗрдВ рд╣реИ? рдореИрдВрдиреЗ рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ ...

рдпрд╣ рдбреЙрдХреНрд╕ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдпреВрдирд┐рдХ рдпреБрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реИрдХ рд╣реИ рдЬреЛ рдпреБрдЧ рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдордп рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдХреА рдЕрд╡рдзрд┐ 24 рдШрдВрдЯреЗ рдпрд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛред

рдЗрд╕ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдмрд╛рддреЗрдВ:

  1. Hh token рдПрдХ рдЯреЛрдХрди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ AM / PM рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреА рдЕрд╡рдзрд┐ рдХреЗрд╡рд▓ 12 рддрдХ рдЬрд╛рдПрдЧреА

  2. рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдПрдХ рдПрдЪрдПрдЪ рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ 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 рдпрджрд┐ рдЖрдк рджрд╕ рд╕реЗ рдХрдо рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рд╕реЗрдХрдВрдб рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдПрдХ рдЕрдЧреНрд░рдгреА рд╢реВрдиреНрдп рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред :рдЖрдБрдЦ рдорд╛рд░рдирд╛:

@butterflyhug @elasticsteve рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЦреНрдп рдХрд╛рд░рдг рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ format ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдПрдХ рд╕рд░рд▓ рдХрдо рд╕рдордп рдХрд╛рдЙрдВрдЯрд░ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореЗрд░реА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП @maggiepint рд╕рдорд╛рдзрд╛рди рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
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.

рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЯреНрд╡рд┐рдЯрд░ @Toon_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.

Uggly, рд▓реЗрдХрд┐рди рдкреНрд░рднрд╛рд╡реАред

2019, рдЕрднреА рднреА рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдорд╛рдирд╡реАрдХрд░рдг рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреИрд░рд╛рдореАрдЯрд░,ред 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 рдХреЗ рдмреАрдЪ рдЕрд╡рдзрд┐ рдХреЗ рдкреНрд░рд╛рд░реВрдкрдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ)

рдЕрднреА рднреА рдЗрд╕рдХреА рдЬрд░реВрд░рдд рд╣реИ

рдЗрди 'рдЧреЗрдЯ' рд╕реЗ рдпреВ рдЯреВ рд╡рд╛рдВрдЯ рдХреЛ рдлреЙрд░реНрдореЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ:

  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

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ :)

рдЦреЗрд▓ рдЦрддреНрдо рд╣реБрдЖ :)

рдзрдиреНрдпрд╡рд╛рдж, рд╕рд░рд╛рд╣рдирд╛ рд╣реИ рдХрд┐ !!!


рдбреЗ: рдЕрд▓реЗрдХреНрд╕реЗрд╕реА рдорд╛рдХрд╕ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рдПрдирд┐рд╡рд╛рдбреЛ: рд╕реЗрдХреНрд╕реНрдЯрд╛-рдлрд┐рд░рд╛, 9 рдбреЗ рдЖрдЙрдЯреБрдмреНрд░реЛ рдбреЗ 2020 11:03
рдкрд╛рд░рд╛: рдкрд▓ / рдкрд▓ рдкрд▓ @noreply.github.com
Cc: рдбрдЧрд▓рд╕ рдЕрдЧреБрдЗрд░ [email protected] ; рдХрдореЗрдВрдЯ рдХрд░реЗрдВ @noreply.github.com
Assunto: рдкреБрди: [рдкрд▓ / рдкрд▓] рдЕрд╡рдзрд┐ рд▓рд╛рдкрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ (# 463)

рдЦреЗрд▓ рдЦрддреНрдо рд╣реБрдЖ :)

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub https://github.com/moment/moment/issues/463#issuecomment-706200427 рдкрд░ рдХрд░реЗрдВ https://github.com/notifications/unsubscribe-auth/AGD22DRNGNIQMOJFQQW7W3W3W3J3/3sJ3b3sJ3 рдкрд░ рджреЗрдЦреЗрдВ ред

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