3

所以我正在使用moment.js。

我看到您可以使用 moment().fromNow(); 将日期转换为人类友好的格式;

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

例如,我想将这个 --> "2 周前" 转换为正常的日期格式或 UNIX 时间戳。

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

4

3 回答 3

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

请注意,这适用于“数字持续时间前”格式的输入字符串。

希望有帮助!

于 2013-05-25T23:54:02.080 回答
0

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

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

var myRegExp = /^(\d+)\+?\s(\w+)\sago$/;
于 2016-04-01T14:09:05.417 回答
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();
    }
}

于 2020-08-24T10:22:52.443 回答