有没有办法使用 Moment.js 来解析相对日期?

Is there a way to parse a relative date using Moment.js?

Moment.js 是一个非常有用的 JavaScript 库,它提供了许多操作日期格式的函数。

为了创建 Moment 对象,可以 parse a string 简单地 moment("1995-12-25"); 或通过提供格式 moment("12-25-1995", "MM-DD-YYYY");.

另一个功能允许我们使用 relative dates : moment("1995-12-25").fromNow() // 19 years ago.

但是,我找不到解析这种相对日期的方法。当我尝试 moment("19 years ago") 时,它只是 returns Invalid date,并且它不存在任何正确格式化日期的标记。

有没有简单的方法来做到这一点?还是应该在 Github 上建议的缺失功能?

唯一的方法是 moment().sub(19, 'years');

你问的是Natural language processing整个计算机科学领域。

有一个最近出现在 github 上的插件,它是允许这种解析的插件:https://github.com/cmaurer/relative.time.parser

我还没有亲自尝试过,但我很快就会(在搜索相同的东西时发现它 这个问题)。

怎么样:

moment.fn.parse = function(_relative, _format){
    var _modulo = moment.normalizeUnits(_format);
    return this.add(_relative, _modulo);
}

moment("30/08/2015", "DD/MM/YYYY").parse(-20, "years").format('DD/MM/YYYY'); // 30/08/1995
moment("30/08/2015", "DD/MM/YYYY").parse(-2, "week").format('DD/MM/YYYY'); // 16/08/2015
moment("30/08/2015", "DD/MM/YYYY").parse(-2, "d").format('DD/MM/YYYY'); // 28/08/2015

我写了插件relative.time.parser。最初的目的是从石墨 from/until 解析相对时间,所以我只针对 'reverse' 的时间。

我也会考虑添加 'NLP' 用例。

谢谢, 克里斯

刚刚发现 chrono 想看看 NLP 是否已经在 momentjs 中实现。看起来它处理将 NLP 解析为日期,可用于创建 momentjs 日期。

Simply pass a string to function chrono.parseDate or chrono.parse.

> var chrono = require('chrono-node')

> chrono.parseDate('An appointment on Sep 12-13') 
Fri Sep 12 2014 12:00:00 GMT-0500 (CDT)

还有一个简单的例子来说明它是如何工作的

代码

const moment = require('moment')
const chrono = require('chrono-node')

let now = moment()
console.log(now)
let yrsAgo = chrono.parseDate("19 years ago")
console.log(yrsAgo)
let yrsAgoMoment = moment(yrsAgo)
console.log(yrsAgoMoment)

输出

$node test.js
moment("2017-06-30T08:29:20.938")
1998-06-30T17:00:00.000Z
moment("1998-06-30T12:00:00.000")

您可以使用片刻加上少量逻辑轻松完成。在这里它运行完美

function parseSincUntilDate(dateStr, now = new Date()) {
  // inputs: 20 minutes ago, 7 hours from now, now, '', or UTC string
  if (moment(dateStr).isValid()) return moment(dateStr).toDate();
  const tokens = dateStr.split(' ');
  if (dateStr.includes('ago')) {
    return moment(now).subtract(tokens[0], tokens[1]).toDate();
  } else if (dateStr.includes('from now')) {
    return moment(now).add(tokens[0], tokens[1]).toDate();
  } else if (dateStr === 'now' || dateStr === '') {
    return new Date(now);
  }
  return moment(dateStr).toDate();
}
// to change relative date, pass it in second parameter

从 Moment.js 1.0.0(2011 年 10 月)到当前:

moment().add(7, 'days');
moment().subtract(1, 'seconds');

适用于年、季度、月、周、日、小时、分钟、秒和毫秒。

https://momentjs.com/docs/#/manipulating/add/

https://momentjs.com/docs/#/manipulating/subtract/