是否有一种方法来解析使用Moment.js相对日期

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

本文关键字:Moment js 日期 相对 方法 一种 是否      更新时间:2023-09-26

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

为了创建Moment对象,可以简单地解析字符串moment("1995-12-25");或提供格式moment("12-25-1995", "MM-DD-YYYY");

另一个特性允许我们使用相对日期:moment("1995-12-25").fromNow() // 19 years ago .

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

是否有简单的方法来做到这一点?或者它是一个缺失的功能,应该建议在Github上?

在查看NLP是否已经在momentjs中实现时发现了chrono。看起来它处理解析NLP到一个日期,这可以用来创建一个momentjs日期。

简单地传递一个字符串给函数chrono。parseDate或sync .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")

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

你的问题暗示了自然语言处理,这是整个计算机科学领域。

最近在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

我编写了plugin relative.time.parser。最初的意图是解析相对时间从石墨从/直到,所以我只是去"反向"的时间。

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

谢谢,克里斯。

你可以很容易地用瞬间加上一点逻辑。这里它工作得很好

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//操作/添加/

https://momentjs.com/docs//操作/减/