.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"
์ด๋ป๊ฒ ์๊ฐํด ?
@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"
@timrwood ์ด๊ฒ์ ๊ตฌํํ ๊ฒฝ์ฐ:
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.
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 '์ ๊ฒฐํฉ๋์์ต๋๋ค. ํ์ ์ถ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด๋ "์ถฉ๋ถํ ์ข์" ๊ตฌํ์ ์ป์ ์ ์์ง๋ง(_ ๋ถ๋ถ์ ์ผ๋ฐ 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
|
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
3์๊ฐ 3์ด์ ๊ฐ์ ์ ํํ ์ถ๋ ฅ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.