是否有一种方法来解析使用Moment.js相对日期
Is there a way to parse a relative date using Moment.js?
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//操作/减/
- Datetime格式为Friendly Time.Moment JS输出错误
- 问题用moment JS制作一个简单的时间表
- 针对重复发生的事件,使用moment.js防止DST偏移
- 如何在moment.js中只比较日期
- 如何用moment.js列出两个日期之间的所有月份
- 用Jquery map和moment js制作一个简单的时间线
- 如何使用Moment JS获得时间
- 如何获得一个只有时间的moment.js日期对象
- 使用moment.js获取时间分区的偏移日期对象
- Moment js and IOS
- moment.js在两个时区格式的日期之间存在差异
- moment js,将EST字符串转换为UTC
- Moment.js不接受变量作为参数
- Moment JS:忽略年份的天数差异
- 使用moment.js获取月份和年份中的所有日期
- moment.js年份/数字格式,阿拉伯语言环境
- 尝试设置时间时Moment JS Deprecation警告
- Moment.js与上午至下午的时间范围进行比较
- Moment.js unix时间戳,以分钟为单位显示以前的时间
- 补偿Moment.js中的utcOffset