我正在使用以下代码使用 moment.js 将服务器端日期时间转换为本地时间。
moment(moment('Wed, 23 Apr 2014 09:54:51 +0000').format('lll')).fromNow()
但我得到:
弃用警告:时刻构造回退到 js 日期。这是不鼓励的,将在即将发布的主要版本中删除。请参阅 https://github.com/moment/moment/issues/1407 了解更多信息。
看来我无法摆脱它!我该如何解决?
要摆脱警告,您需要:
传入日期字符串的 ISO 格式版本: moment('2014-04-23T09:54:51');
传入您现在拥有的字符串,但告诉 Moment 字符串的格式: moment('Wed, 23 Apr 2014 09:54:51 +0000', 'ddd, DD MMM YYYY HH:mm:ss ZZ');
将您的字符串转换为 JavaScript Date 对象,然后将其传递给 Moment: moment(new Date('Wed, 23 Apr 2014 09:54:51 +0000'));
最后一个选项是 Moment 目前支持的内置回退,带有已弃用的控制台警告。他们说他们不会在未来的版本中支持这种回退。他们解释说使用 new Date('my date')
太不可预测了。
作为替代方案,您可以通过设置 moment.suppressDeprecationWarnings = true;
来禁止显示弃用警告
// @ts-ignore
(至少对于某些版本的 moment-timezone 和 @types/moment-timezone)。
moment
中的日期构造在内部使用 javascript 中的 new Date()
。 new Date()
构造可识别所有浏览器中 RFC2822 或 ISO 格式的日期字符串。构造日期不是这些格式的 moment
对象时,会引发弃用警告。
尽管会引发弃用警告,但对于某些格式,moment
对象将在 Chrome 中成功构建,但在 Firefox 或 Safari 中不会。因此,在 Chrome 中处理日期可能会产生预期的结果(并非总是)并在其他人中抛出 Invalid Date
。
考虑,02.02.2018
,
铬 - moment("02.02.2018")._d
-> Fri Feb 02 2018 00:00:00 GMT+0530 (India Standard Time)
火狐 - moment("02.02.2018")._d
-> Invalid Date
Safari - moment("02.02.2018")._d
-> Invalid Date
因此,如果未使用推荐/标准格式,则使用 moment.js
的风险由您自行承担。
为了抑制弃用警告,
正如@Joe Wilson 在之前的回答中所建议的那样,给出时刻构造的日期格式。
示例:moment("02.05.2018", "DD.MM.YYYY").format("DD MM YYYY");
以 ISO 或 RFC2822 格式给出日期。
示例:moment("2018-02-01T18:30:00.000Z")
- ISO 格式
moment("Thu, 01 Feb 2018 18:30:00 GMT")
- RFC2822 格式 - Format in Github
正如@niutech 在上一个答案中所建议的那样,设置
moment.suppressDeprecationWarnings = true;
我建议立即覆盖输入回退。 moment.createFromInputFallback=function (config){ config._d = new Date(config._i); }
由于(3)将抑制所有警告,(4)将仅抑制日期构造回退。使用 (4),您将获得 Invalid Date
,因为使用了内部 new Date()
,并且可以在控制台中看到其他弃用,因此可以升级时刻或可以在应用程序中替换弃用的方法。
如果您的日期是从 API 作为 string
传递给您的(就像我的问题一样),您可以使用过滤器暂时将字符串转换为日期。这将处理施工警告。
$scope.apiDate = 10/29/2017 18:28:03";
angular.module('myApp').filter('stringToDate', function() {
return function(value) {
return Date.parse(value);
};
});
将其添加到视图中:
{{apiDate | stringToDate | amDateFormat:'ddd, MMM DD'}}
如上述答案所示。提供日期格式应该有效。
为什么我会使用以下代码行收到弃用消息。我认为 String + 格式应该可以解决这个问题。 moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York')
。另外,请不要我无法控制所提供的日期格式。我知道我可以自己将其转换为 'YYYY-MM-DDTHH:mm:ss'
然后时刻不显示弃用消息。但是,根据文档,代码行应该可以工作。这是我看到的弃用消息。
“弃用警告:提供的值不是公认的 RFC2822 或 ISO 格式。时刻构造回退到 js Date(),这在所有浏览器和版本中都不可靠。不鼓励使用非 RFC2822/ISO 日期格式,并将在即将发布的主要版本。有关更多信息,请参阅 http://momentjs.com/guides/#/warnings/js-date/。
就我而言,我试图生成一个日期时间以包含在我的表单数据中。但是我可以访问的字符串的格式看起来像“10-Sep-2020 10:10”所以当尝试使用像这样的时刻时
myDate = '10-Sep-2020 10:10';
moment(myDate).format('YYYY-MM-DD HH:mm:ss');
我收到了弃用警告。使用字符串创建日期没有问题,但您只需要让 moment 知道您传入的是什么。如明确说明它将接收的格式,例如
moment(myDate, 'DD-MMM-YYYY HH:mm').format('YYYY-MM-DD HH:mm:ss');
结果:2020-09-10 10:10:00
就是这样,警告消失了,时刻很开心,并且您已经准备好持久化的日期时间格式。
moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring());
可以吗?还是我只是在压制一个问题,准备在不久的将来像这样默默地崩溃?Invalid
日期结果。