有没有办法使用moment.js获得给定持续时间的单位和价值

时间:2016-01-19 06:55:02

标签: javascript momentjs

我的持续时间值如下:

var duration = "7 days";

从上面我想得到具有价值和单位的对象,如:

time {
  value: 7,
  unit: days
}

我知道我可以使用JavaScript获取价值和单位。但我认为如果我能用momentjs的某种方法做到这一点会更好。 我浏览了momentjs文档,但我找不到。

有没有办法用momentjs来实现这个目标?

3 个答案:

答案 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

toJSON()吗?

很好的尝试,但是在另一种情况下提出的moment.duration()。toJSON()在这种情况下将无济于事,因为它以“ PT5M”的形式返回一个带有字符串的对象,实际上不是我们想要的。

请参阅:http://momentjs.com/docs/#/durations/as-json/