所以我正在使用moment.js。
我看到您可以使用 moment().fromNow(); 将日期转换为人类友好的格式;
有没有办法做相反的事情?
例如,我想将这个 --> "2 周前" 转换为正常的日期格式或 UNIX 时间戳。
我筛选了文档,但找不到任何东西。任何方向都会有所帮助,谢谢。
根据输入字符串的复杂程度/不同程度,您可以这样做:
//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
请注意,这适用于“数字持续时间前”格式的输入字符串。
希望有帮助!
在某些情况下.fromNow()
,会返回类似“30+ 天前”的字符串。上述解决方案中提供的正则表达式无法正确解析。
这是处理这种情况的更新正则表达式:
var myRegExp = /^(\d+)\+?\s(\w+)\sago$/;
这是我用来在当前 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();
}
}