所以我正在使用moment.js。
我看到你可以使用moment()将日期翻译成人性化的格式.fromNow();
有没有办法做相反的事情?
例如,我想转此 - > “2周前”进入正常日期格式或UNIX时间戳。
我筛选了文档,却找不到任何东西。任何方向都会有所帮助,谢谢。
答案 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();
}
}