moment.js reverse .fromNow()

时间:2013-05-25 23:35:40

标签: node.js momentjs

所以我正在使用moment.js。

我看到你可以使用moment()将日期翻译成人性化的格式.fromNow();

有没有办法做相反的事情?

例如,我想转此 - > “2周前”进入正常日期格式或UNIX时间戳。

我筛选了文档,却找不到任何东西。任何方向都会有所帮助,谢谢。

3 个答案:

答案 0 :(得分:3)

根据输入字符串的复杂程度和不同,您可以这样做:

//parse out the number and the duration

var inputString = "2 weeks ago";

var myRegExp = /^(\d+)\s(\w+)\sago$/;

var results = myRegExp.exec(inputString);

var num = results[1];
var duration = results[2];

moment().subtract(duration,num).toString() //or whatever format you prefer

请注意,这适用于格式为“number duration ago”的输入字符串。

希望有所帮助!

答案 1 :(得分:0)

在某些情况下,.fromNow()会返回类似“30天以前”的字符串。上述解决方案中提供的正则表达式无法正确解析。

这是处理这种情况的更新的正则表达式:

var myRegExp = /^(\d+)\+?\s(\w+)\sago$/;

答案 2 :(得分:0)

这是我用于在当前moment.js语言环境中将其反转的方法。我在几个语言环境中对其进行了测试,它应该适用于每种语言环境,但可能并非如此。
将最后两个.toString()函数更改为.valueOf()以获取数值。

Moment实际上现在没有所有语言的星期名称数据,因此如果找不到该值,该函数将假定该字符串为星期。
有些语言使用翻译功能而不是内置值,因此脚本也无法在其中使用!如果您手动指定语言数据,那么它应该可以工作。

//test en locale
moment.locale("en");
console.log(reversefromNow("5 days ago"));
console.log(reversefromNow("in 5 days"));
//test ja locale
moment.locale("ja");
console.log(reversefromNow("5 日前"));
console.log(reversefromNow("5 日後"));

function reversefromNow(input) {
    let relativeLocale = JSON.parse(JSON.stringify(moment.localeData()._relativeTime));
    let pastfutureObject = {
        future: relativeLocale.future,
        past: relativeLocale.past
    };
    delete relativeLocale.future;
    delete relativeLocale.past;

    //detect if past or future
    let pastfuture;
    for (const [key, value] of Object.entries(pastfutureObject)) {
        if (input.indexOf(value.replace("%s", "")) != -1) {
            pastfuture = key;
        }
    }

    //detect the time unit
    let unitkey;
    for (const [key, value] of Object.entries(relativeLocale)) {
        if (input.indexOf(value.replace("%d", "")) != -1) {
            unitkey = key.charAt(0);
        }
    }

    //if its not in the data, then assume that it is a week
    if (unitkey == null) {
        unitkey = "w";
    }

    const units = {
        M: "month",
        d: "day",
        h: "hour",
        m: "minute",
        s: "second",
        w: "week",
        y: "year"
    };
    //Detect number value 
    const regex = /(\d+)/g;
    let numbervalue = input.match(regex) || [1];
    //Add if future, subtract if past
    if (pastfuture == "past") {
        return moment().subtract(numbervalue, units[unitkey]).valueOf();
    } else {
        return moment().add(numbervalue, units[unitkey]).valueOf();
    }
}