Javascript 'x days ago' 到日期时间
Javascript 'x days ago' to datetime
我有以下格式显示日期的字符串:
x minutes/hours/days/months/years ago
我需要使用 javascript / nodejs 将其解析为 2021-08-05T09:44:19.014Z
之类的日期时间格式。
好像momentjs
做不到
有办法吗?
当然有。
这是我想出的一个简单实现,它可以将诸如“10 小时”(巧合的是“10 小时前”,因为正则表达式在另一端未锚定)之类的字符串转换为秒数。
然后您可以从当前日期中减去该秒数,或者按照您喜欢的方式处理。
const multipliers = {
second: 1,
minute: 60,
hour: 60 * 60,
day: 60 * 60 * 24,
month: 60 * 60 * 24 * 30,
year: 60 * 60 * 24 * 365,
};
function parseTextDuration(s) {
var m = /^(.+)\s*(second|minute|hour|day|month|year)/i.exec(s);
if (!m) throw new Error("invalid string");
const [, mulStr, unit] = m;
const mul = parseFloat(mulStr);
if (isNaN(mul)) throw new Error("invalid number");
const unitMul = multipliers[unit.toLowerCase()];
if (!unitMul) throw new Error("invalid unit");
return mul * unitMul;
}
示例:
> console.log(parseTextDuration("10 months"));
25920000
> console.log(parseTextDuration("3 minutes ago"));
180
这是我的建议
const methods = {
minutes: (d,mins) => d.setMinutes(d.getMinutes() - mins),
hours: (d,hours) => d.setHours(d.getHours() - hours),
days: (d,days) => d.setDate(d.getDate() - days),
months: (d,months) => d.setDate(d.getMonth() - months),
years: (d,years) => d.setDate(d.getMonth() - years)
}
const ago = str => {
const d = new Date()
let [_,howmany, scale] = [...str.match(/(\d+) (\w+)\b/)]
scale = scale.endsWith("s") ? scale : `${scale}s`
return new Date(methods[scale](d,howmany));
}
const str = "10 minutes ago"
console.log(ago(str))
我有以下格式显示日期的字符串:
x minutes/hours/days/months/years ago
我需要使用 javascript / nodejs 将其解析为 2021-08-05T09:44:19.014Z
之类的日期时间格式。
好像momentjs
做不到
有办法吗?
当然有。
这是我想出的一个简单实现,它可以将诸如“10 小时”(巧合的是“10 小时前”,因为正则表达式在另一端未锚定)之类的字符串转换为秒数。
然后您可以从当前日期中减去该秒数,或者按照您喜欢的方式处理。
const multipliers = {
second: 1,
minute: 60,
hour: 60 * 60,
day: 60 * 60 * 24,
month: 60 * 60 * 24 * 30,
year: 60 * 60 * 24 * 365,
};
function parseTextDuration(s) {
var m = /^(.+)\s*(second|minute|hour|day|month|year)/i.exec(s);
if (!m) throw new Error("invalid string");
const [, mulStr, unit] = m;
const mul = parseFloat(mulStr);
if (isNaN(mul)) throw new Error("invalid number");
const unitMul = multipliers[unit.toLowerCase()];
if (!unitMul) throw new Error("invalid unit");
return mul * unitMul;
}
示例:
> console.log(parseTextDuration("10 months"));
25920000
> console.log(parseTextDuration("3 minutes ago"));
180
这是我的建议
const methods = {
minutes: (d,mins) => d.setMinutes(d.getMinutes() - mins),
hours: (d,hours) => d.setHours(d.getHours() - hours),
days: (d,days) => d.setDate(d.getDate() - days),
months: (d,months) => d.setDate(d.getMonth() - months),
years: (d,years) => d.setDate(d.getMonth() - years)
}
const ago = str => {
const d = new Date()
let [_,howmany, scale] = [...str.match(/(\d+) (\w+)\b/)]
scale = scale.endsWith("s") ? scale : `${scale}s`
return new Date(methods[scale](d,howmany));
}
const str = "10 minutes ago"
console.log(ago(str))