有没有办法使用 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');
适用于年、季度、月、周、日、小时、分钟、秒和毫秒。
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');
适用于年、季度、月、周、日、小时、分钟、秒和毫秒。