我的持续时间值如下:
var duration = "7 days";
从上面我想得到具有价值和单位的对象,如:
time {
value: 7,
unit: days
}
我知道我可以使用JavaScript
获取价值和单位。但我认为如果我能用momentjs
的某种方法做到这一点会更好。
我浏览了momentjs
文档,但我找不到。
有没有办法用momentjs
来实现这个目标?
答案 0 :(得分:0)
来自您可以获得的文档: http://momentjs.com/docs/#/durations/as-json/
moment.duration().toJSON();
将持续时间对象序列化为JSON时,它将被表示为ISO8601字符串。
JSON.stringify({
postDuration : moment.duration(5, 'm')
}); // '{"postDuration":"PT5M"}'
答案 1 :(得分:0)
我写了这个函数(在.ts中)来获取时间刻度:
export enum Unit {
minute,
hour,
day,
week,
month
};
export type Duration = {
value : number;
unit : keyof typeof Unit;
}
const getTimescale = ( input : string ) => {
const duration = moment.duration(input);
const units = Object.keys(Unit).filter(k => typeof Unit[k as any] === "number").reverse() as Array<keyof typeof Unit>;
let result = {} as Duration;
for (let i = 0; i < units.length; i++) {
let value = duration.get(units[i] as keyof typeof Unit);
if( result.unit && value ){
if( moment.duration(duration, units[i] as keyof typeof Unit).subtract( moment.duration( result.value, result.unit )) > moment.duration(0) ){
return { value, unit : units[i] as keyof typeof Unit }
} else {
return result;
}
};
result = { value, unit : units[i] as keyof typeof Unit };
};
return result;
}
答案 2 :(得分:0)
今天我处在类似的情况下,我找到了一个简单的解决方案。
就我而言,我不得不告诉用户他可以选择1个月(最大)范围。但是,无论用户选择30天还是34天,在两种情况下humanize()
都会返回“ 1 month”。我就是这样结束的。希望这可以帮助一些人节省一些时间。
因此,使用moment.duration().humanize()
或moment.duration().days()
代替了使用.asDays()
的技巧。
您还可以使用.get(unit)
来获取余数。
示例:如果持续时间为31天,则执行duration.get('days')
,它将返回1
。
每个单元都一样。参见:https://momentjs.com/docs/#/durations
很好的尝试,但是在另一种情况下提出的moment.duration()。toJSON()在这种情况下将无济于事,因为它以“ PT5M”的形式返回一个带有字符串的对象,实际上不是我们想要的。