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))