Moment: ๊ธฐ๋Šฅ ์š”์ฒญ: ๋ณด๋‹ค ์ •ํ™•ํ•œ .humanize

์— ๋งŒ๋“  2012๋…„ 06์›” 24์ผ  ยท  112์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: moment/moment

.humanize๋Š” ์ดˆ์— ๊ด€ํ•ด์„œ๋Š” ์‹ค์ œ๋กœ ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ข…์ข… ์ด ์ˆ˜์ค€์˜ ์ •ํ™•๋„๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ๋•Œ๋กœ๋Š” ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ •ํ™•ํ•œ ๊ฐ’์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด API๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

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

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

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด ?

Enhancement New Feature

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

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

3์‹œ๊ฐ„ 3์ดˆ์™€ ๊ฐ™์€ ์ •ํ™•ํ•œ ์ถœ๋ ฅ์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  112 ๋Œ“๊ธ€

@FGLibreau , ์ด ๋ฌธ์ œ๋Š” #232์— ๋‚˜์™”๊ณ  ๊ฑฐ๊ธฐ์— ์žˆ๋Š” OP๋Š” ์ฝ”์–ด์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

precise-english ๋˜๋Š” ๋ณด๋‹ค ์ •ํ™•ํ•œ ์ƒ๋Œ€ ์‹œ๊ฐ„์„ ์›ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด ์ •์˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด instance lang ๊ธฐ๋Šฅ์ด 1.7.0์— ๋‚˜์˜ค๋ฉด ๊ฝค ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ชจ๋“  ์–ธ์–ด ์ •์˜๋Š” ์˜์–ด์—์„œ ์ง€์ •๋˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ฐ’์„ ์ƒ์†ํ•˜๋ฏ€๋กœ relativeTime ์‚ฌ์ „๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ƒ์†์€ ์‚ฌ์ „ ๋‚ด์—์„œ ์ƒ์†๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ „์ฒด ์‚ฌ์ „์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : #232์— ์„ค๋ช…๋œ ๋ฐฉ๋ฒ•์€ #332์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด 1.7.0์—์„œ ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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 , ์šฐ๋ฆฌ์—๊ฒŒ _์Šค๋งˆํŠธํ•œ_ ์ƒ์†์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๋” ๋˜‘๋˜‘ํ•œ ์ƒ์†์„ ์ถ”๊ฐ€ํ•˜๋ฉด CLDR๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฐ ํ•˜์œ„ ์–ธ์–ด๊ฐ€ ๋งˆ์Šคํ„ฐ ์–ธ์–ด์—์„œ ์ƒ์†๋ฐ›๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ fr_CA ๋Š” fr ์—์„œ ์ƒ์†๋˜๊ณ  en_GB ๋Š” en ์—์„œ ์ƒ์†๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ 'relativeTime.s'๋งŒ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์‹ฌ์ธต ํ™•์žฅ์„ ์ˆ˜ํ–‰ํ•  ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@FGRibreau ๊ฐ€ precise-en ์–ธ์–ด ์ •์˜์— ๋”ฐ๋ผ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์„ @rockymeza ์˜ ์†”๋ฃจ์…˜์œผ๋กœ ๋‹ซ๋Š” ๊ฒƒ์ด ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์„ ํ˜ธ๋˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ช‡ ์ดˆ ์ด์ƒ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„, ๋…„ ๋“ฑ์— ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์„ ํ˜ธํ•˜๋Š” ์†”๋ฃจ์…˜์€ ์˜์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฒญ๊ฐ์—๋งŒ ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š” ๋ช…์‚ฌ ๊ตด์ ˆ(๊ธฐ์šธ์ž„)๋กœ ์ž์‹ ์„ ๊ท€์ฐฎ๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๊ฐ€์ค‘์น˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์นด์šดํŠธ๋‹ค์šด์„ ๊ณ ์•ˆํ•  ๋•Œ๋Š” ์ •๋ฐ€๋„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ง€๋‚œ ์ผ์„ ๋ณผ ๋•Œ "10์‹œ๊ฐ„ ์ „"์ด ์žˆ์–ด๋„ ๊ดœ์ฐฎ์ง€๋งŒ, ์ด๋ฒคํŠธ๋ฅผ ๊ฐ„์ ˆํžˆ ๊ธฐ๋‹ค๋ฆฌ๋ฉด "10์‹œ๊ฐ„ 3๋ถ„ 8์ดˆ"๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ์–ป์œผ๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ์–ธ์–ด๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค๊ณ  ๋งํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

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

3์‹œ๊ฐ„ 3์ดˆ์™€ ๊ฐ™์€ ์ •ํ™•ํ•œ ์ถœ๋ ฅ์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €๋„ ์ด ๊ธฐ๋Šฅ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

์ •ํ™•ํ•œ ์ธ๊ฐ„ํ™” ๋ฒ„์ „๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ๋˜ํ•œ Moment์˜ humanize๊ฐ€ (์„ ํƒ์ ์œผ๋กœ) ๋” ์ •ํ™•ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์ง€๊ธˆ ์—ฌ๊ธฐ์— ์†”๋ฃจ์…˜์„ ์ฐพ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด 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!

์ •ํ™•ํ•œ ์ธ๊ฐ„ํ™” ์ง€์† ์‹œ๊ฐ„์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์—†๋‹ค๋Š” ์‚ฌ์‹ค์— ์ •๋ง ์‹ค๋งํ–ˆ์Šต๋‹ˆ๋‹ค. :|

๋ฌธ์„œ์—์„œ ์ฐธ์กฐํ•˜๋Š” Precise Range ๋ผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ •ํ™•ํ•œ ๋ฒ”์œ„๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ์ˆœ๊ฐ„ ๊ฐœ์ฒด ๋Œ€์‹  ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ ๋‚ด๊ฐ€ ์ข‹์•„ํ•  ๋งŒํ•œ ๋‚ ์งœ ๋ถ€๋ถ„์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ณ ๋ฅผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์–ธ์–ด(imo)๋„ ์•ฝ๊ฐ„ ๋ฒ—์–ด๋‚ฌ์œผ๋ฉฐ ํ•œ ๊ฒฐ๊ณผ๋Š” '1์‹œ๊ฐ„ 19๋ถ„ ๋ช‡ ์ดˆ'์˜€์Šต๋‹ˆ๋‹ค. 1์‹œ๊ฐ„ 19๋ถ„ ๋ช‡ ์ดˆ ์ •๋„๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹จ์–ด์™€ ์ˆซ์ž๋ฅผ ํ˜ผํ•ฉํ•˜๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ์•ฝ๊ฐ„์˜ ๋ฌธ๋ฒ•์  ๊ธˆ๊ธฐ ์‚ฌํ•ญ์ด์—ˆ์Šต๋‹ˆ๋‹ค(๋‚ด๊ฐ€ ์•„๋Š” ํ•œ).

์ •ํ™•ํ•œ ์ˆœ๊ฐ„์„ ์œ„ํ•œ +1 ์ธ๊ฐ„ํ™”

@Envek Precise Range๋Š” ์ข‹์•„ ๋ณด์ด์ง€๋งŒ i18n/l10n์€ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ...

๋‚ด ํ”„๋กœ์ ํŠธ ์ค‘ ์ ์–ด๋„ 2~3๊ฐœ์—์„œ ์ด๊ฒƒ์ด ํ•„์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— moment.js์˜ ๊ณต์‹ ์ง€์›์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ํ† ํŒ์‹œ +1

+1

@doingweb HumanizeDuration.js ๋ชจ๋“ˆ์ด ๊ฝค ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค!

์ •ํ™•ํ•œ ์ˆœ๊ฐ„์„ ์œ„ํ•œ +1 ์ธ๊ฐ„ํ™”

๋” ์ •ํ™•ํ•œ ์ˆœ๊ฐ„ ์ธ๊ฐ„ํ™”๋ฅผ ์œ„ํ•ด +1

+1

+1

+1

+1

+1

+1

+1

์ด๊ฒŒ ์™œ ๋งจ๋‚  ๋‹ซํ˜€์š”? ์ด๊ฒƒ์€ moment.js์—์„œ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•˜๋Š” ๊ฐ€์žฅ ๋ถ„๋ช…ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ด๋ฏธ ๋“ค์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ์‚ฌ์‹ค์— ์‹ค์ œ๋กœ ์ถฉ๊ฒฉ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. Humanize๊ฐ€ ์—†๋Š” ํฌ๋Ÿผ์˜ ๊ฒŒ์‹œ๋ฌผ๊ณผ ๊ฐ™์ด ๋ชจํ˜ธํ•œ ์‹œ๊ฐ„ ํ‘œ์‹œ ์™ธ์—๋Š” ์•„๋ฌด ์†Œ์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค.

+1

+1

+1

-1. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ง€๊ธˆ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์ธ๊ฐ„ํ™”ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ง€์† ์‹œ๊ฐ„์˜ "์ธ๊ฐ„ ์นœํ™”์ ์ธ" ๋ฒ„์ „์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

"์•ˆ๋…• Frank, ์–ธ์ œ ๊ทธ ์ด๋ฉ”์ผ์„ ๋ณด๋ƒˆ์–ด?"
"์•ฝ 1๋ถ„ ์ „."

๋Œ€

"์•ˆ๋…• Frank, ์–ธ์ œ ๊ทธ ์ด๋ฉ”์ผ์„ ๋ณด๋ƒˆ์–ด?"
"43์ดˆ ์ „."

์–ด๋Š ์ชฝ์ด ๋” "์ธ๊ฐ„์ "์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

๋” ์ •ํ™•ํ•œ ๋ฒ„์ „์€ ํ˜„์žฌ ๋ฒ„์ „์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.

+1, @mattgrande ์ง€๊ธˆ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๊ณผ๊ฑฐ์˜ ๊ธฐ๊ฐ„์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์˜ˆ๋ฅผ ๋“ค์–ด "1์‹œ๊ฐ„ 30๋ถ„"๊ณผ ๊ฐ™์ด ์•ฝ์† ์‹œ๊ฐ„์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ๋Š” ์ ์ ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

๋‚˜์—๊ฒŒ์„œ ์ด๊ฒƒ์— ๋Œ€ํ•ด +1. ์ƒˆ ์–ธ์–ด ์ •์˜๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ธฐ์กด ์–ธ์–ด ์ •์˜๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ Moment์—์„œ ์ง€์›ํ•˜๋Š” ์–ธ์–ด๊ฐ€ 108๊ฐœ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 108๊ฐœ์˜ ์ •์˜๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜(๋ชจ๋‘ ๋ฌธ๋ฒ•์ ์œผ๋กœ ์ •ํ™•ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค), ์•„๋‹ˆ๋ฉด ์˜์–ด๋ฅผ ๋ชปํ•˜๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์žŠ์–ด๋ฒ„๋ฆฌ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‘˜ ๋‹ค ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค ...

๋‚˜๋Š” ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :

````์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
var humanizeDuration = function(eventDuration){
eventMDuration = moment.duration(eventDuration, '์ดˆ');
์ด๋ฒคํŠธ ๊ธฐ๊ฐ„ ๋ฌธ์ž์—ด = ""
if (eventMDuration.days() > 0)
eventDurationString += " " + moment.duration(eventMDuration.days(), '์ผ').humanize()
if (eventMDuration.hours() > 0)
eventDurationString += " " + moment.duration(eventMDuration.hours(), '์‹œ๊ฐ„').humanize()
if (eventMDuration.minutes() > 0)
eventDurationString += " " + moment.duration(eventMDuration.minutes(), '๋ถ„').humanize()

return eventDurationString.trim()
}
````

+1

์ด ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฉด +1 ์‹œ๊ฐ„ ์ถ”์ ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

+1

+1

+1

์—ฌ์ „ํžˆ '์ธ๊ฐ„' ์˜ต์…˜์ด ๋” ์ •ํ™•ํ•˜๋ฉด์„œ๋„ ์„ ํƒ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

+1

+1

+1

+1

+1. ๊ธฐ๊ฐ„์„ ์ •ํ™•ํ•˜์ง€๋งŒ ์‚ฌ๋žŒ ํ˜•์‹์œผ๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•˜๋Š” ํšŒ๊ณ„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ž‘์—…. "1๋…„ 2๊ฐœ์›” 3์ผ"์ด "398์ผ"๋ณด๋‹ค ๋‚ซ์ง€๋งŒ "1๋…„"์€ ์‹ค์ œ๋กœ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ตฌํ˜„์€ ๋„ˆ๋ฌด ์ธ๊ฐ„์ ์ด์–ด์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

+1

duration.humanize ์—๋Š” ๋‹จ์œ„๊ฐ€ ๋ถ„, ์‹œ๊ฐ„ ๋“ฑ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ์‹œ์ ์„ ์ •์˜ํ•˜๋Š” ์ž„๊ณ„๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ๋ณธ์ ์œผ๋กœ 45์ดˆ ์ด์ƒ์€ 1๋ถ„์œผ๋กœ ๊ฐ„์ฃผ๋˜๊ณ  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"

lodash ๋ฐ ๋ณต์ˆ˜ํ˜• ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@timrwood ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ:

  1. @rockymeza ์˜ https://github.com/moment/moment/issues/348#issuecomment -6535794 ์†”๋ฃจ์…˜์€ ์šฐ๋ฆฌ(๋ชจ๋“  ๋‹จ์ผ ๊ฐœ๋ฐœ์ž)๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ์–ธ์–ด๋กœ ์ด๋ฅผ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๊ณ ์ž๋“ค์€ ์ด๋ฏธ ๋งŽ์€ ์–ธ์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๋†€๋ผ์šด ์ผ์„ ํ•ด๋ƒˆ์Šต๋‹ˆ๋‹ค.
  2. @mattgrande https://github.com/moment/moment/issues/348#issuecomment -237830415 ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ์ธ๊ฐ„์ ์ด๋ผ๋Š” ์ฃผ์žฅ์€ ๊ทธ์ € ๊ทธ๋Ÿฐ ๋ถ€๋ถ„์ด ์ž˜ ์ž‘๋™ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ถ€๋ฅด๋Š” ๊ฒƒ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋Œ€ํ™”๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

Hey Frank, ๋‚˜ ์ ์‹ฌ ๋จน์œผ๋Ÿฌ ๊ฐˆ๊ฒŒ, ๋‹ค์Œ ํšŒ์˜๊นŒ์ง€ ์–ผ๋งˆ๋‚˜ ์‹œ๊ฐ„์ด ์žˆ์–ด?
ํ•œ์‹œ๊ฐ„

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

```js
moment.duration({hours: 0, minutes: 45}).humanize() === "an hour"
moment.duration({hours: 1, minutes: 29}).humanize() === "an hour"
```
This means that if we understand things differently I could be ~45 minutes early or late for that meeting.
  1. RTFM์„ ๋ถˆ๋Ÿฌ ์ฃผ์‹  @sproot ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

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

    ์กฐ๊ธˆ ๋‚˜์•„์ง€๊ธด ํ–ˆ์ง€๋งŒ ํœด์‹ ์‹œ๊ฐ„์ด 60๋ถ„๋ณด๋‹ค ๊ธธ๋ฉด ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ~30๋ถ„์˜ ์ฐจ์ด๋Š” ๋‚ด๊ฐ€ ์ง‘์— ๊ฐ€์„œ ๋จน๊ณ  ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๊ฑฐ๋‚˜ ๊ทผ์ฒ˜์—์„œ ๋ญ”๊ฐ€๋ฅผ ์žก์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. @Nerian https://github.com/moment/moment/issues/348#issuecomment -279819773 ๋ฐ @cogwirrel https://github.com/moment/moment/issues/348#issuecomment -346233713์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด @sproot '์™€ ๊ฒฐํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŒ์€ ์ถ”๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด๋„ "์ถฉ๋ถ„ํžˆ ์ข‹์€" ๊ตฌํ˜„์„ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ(_ ๋ถ€๋ถ„์€ ์ผ๋ฐ˜ JS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ) ์ง์ ‘ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ํ•ดํ‚น์ž…๋‹ˆ๋‹ค.

    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"
    

    (์ฐธ๊ณ : ์ดˆ ํ˜•์‹ ๋ฐ ๋กœ์ผ€์ผ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” #4183์˜ #3981๋กœ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค.)

๊ทธ ๊ฐ€์น˜๋ฅผ ์œ„ํ•ด ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๋ฐฉ๊ธˆ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

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

๋‚ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉฐ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์ด๊ฒƒ์ด์ด ๋ฌธ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ข…๋ฃŒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ...?

@mercmobily for AU, US(CA), UK: ์˜ˆ, ROW: ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ https://github.com/codebox/moment-precise-range/issues/6 ์ด ์ˆ˜์ •๋˜์—ˆ์„ ๋•Œ.

(์ฐธ๊ณ : moment ๋ฐ *60*1000 ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์—๊ฒŒ๋Š” ์กฐ๊ธˆ ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. moment().add(durationInMinutes, 'minutes') ๋ฅผ ๊ณ ๋ คํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ?)

์•„, ๋‚˜๋Š” Moment์— ์ •ํ†ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! 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

๋‹ค์Œ์€ lodash๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” @cogwirrel ๊ธฐ๋ฐ˜์˜ ์ž‘์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

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

(๋งŒ์•ฝ ๋‹น์‹ ์ด humanize() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด "1.51์‹œ๊ฐ„"์„ "2์‹œ๊ฐ„"์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ํŠน๋ณ„ํžˆ ์ธ๊ฐ„์ ์ธ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

+1 ๐Ÿ˜ž
๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Moment.js์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์žฌ๊ฒ€ํ† ํ•ด์ฃผ์„ธ์š”!

+1

+1

+1

+1

PS ๋ฏฟ์„ ์ˆ˜ ์—†์ง€๋งŒ ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค ;(

+1 ์ง„์งœ ์ด๊ฑฐ ์•„์ง ์•ˆ๋‚˜์˜ค๋„ค?!

๋งˆ์นจ๋‚ด ๊ตฌ๋…์„ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค(์ด๋ฏธ ์•ฝ 7๋…„์ด ์ง€๋‚ฌ์ง€๋งŒ ๋งˆ์นจ๋‚ด ๋ชจ๋“  +1๊ณผ ํ•จ๊ป˜ ๊ตฌ๋…์„ ์ทจ์†Œํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค)

๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค ๐ŸŽ‰
https://github.com/EvanHahn/HumanizeDuration.js

๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ๋„ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

+1

+1

+1

+1

๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ฒฌํ•ด:

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

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

์ด๊ฒƒ์€ ๋งŽ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ง€์† ์‹œ๊ฐ„์˜ ์ •ํ™•ํ•œ ํ˜•์‹์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์˜ฌ๋ฆผ ์—†์ด ์ธ๊ฐ„ํ™”ํ•˜๋Š” ์˜ต์…˜์„ ์›ํ•ฉ๋‹ˆ๋‹ค.
+1

์ด๊ฒƒ์— +1

+1

+1

+1

+1

๋ˆ„๊ตฐ๊ฐ€ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰ ํ›„ ์—ฌ๊ธฐ์— ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ด ๊ตฌ์„ฑ/ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ œ ๊ฒฝ์šฐ์—๋Š” ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

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

๋‚ด ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ์ •ํ™•์„ฑ์€ ๋ณด๊ธฐ ์ข‹์€ ํ…์ŠคํŠธ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ moment.relative*() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌ์„ฑ/ํ˜ธ์ถœํ•˜๊ธฐ ์ „๊ณผ ํ›„๋ฅผ ๋น„๊ตํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

| ๊ธฐ๊ฐ„ | ์ „์— | ํ›„ |
| ---------- | --------------- | -------------- |
| 3s | a few seconds | 3 seconds |
| 44s | a few seconds | 44 seconds |
| 45s | a minute | 45 seconds |
| 1m 29s | a minute | 1.48 minutes |
| 1m 30s | 2 minutes | 1.5 minutes |
| 1m 59s | 2 minutes | 1.98 minutes |
| 44m | 44 minutes | 44 minutes |
| 45m | an hour | 45 minutes |
| 1h 29m | an hour | 1.48 hours |
| 1h 30m | 2 hours | 1.5 hours |
| 21h | 21 hours | 21 hours |
| 22h | a day | 22 hours |
| 35h | a day | 35 hours |
| 35h 30m | a day | 35.5 hours |
| 36h | 2 days | 36 hours |

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰