【发布时间】:2018-06-22 05:46:39
【问题描述】:
我在 Angular 应用程序中使用 moment.js 收到以下代码的警告:
moment(value).add(6, 'hours').format("MM/DD/YYYY");
打印到控制台的警告/错误是:
moment.js:293 弃用警告:提供的值不在 认可的 RFC2822 或 ISO 格式。时刻构建回退到 js Date(),它在所有浏览器和版本中都不可靠。非 不鼓励使用 RFC2822/ISO 日期格式,并将在 即将发布的主要版本。请参阅 http://momentjs.com/guides/#/warnings/js-date/ 了解更多信息。 参数:[0] _isAMomentObject:真,_isUTC:假,_useUTC:假, _l: undefined, _i: Apr 10, 2007, 10:00:00 PM, _f: undefined, _strict: undefined, _locale: [object Object]
我查看了警告中链接的文档页面,但我仍然不清楚需要更改哪些内容才能摆脱弃用警告。例如,我尝试添加一个空数组作为第二个参数:
moment(value, []).add(6, 'hours').format("MM/DD/YYYY");
...但是虽然这消除了错误,但我在视图中打印了“无效日期”,而不是实际日期。我需要如何调整此处的语法以消除警告?
更新:提供的值是使用 Angular 日期管道转换的 UTC 值。所以我要通过两个管道:首先是 Angular 日期管道,然后是这个自定义管道使用矩。完整的管道代码如下所示:
import { Pipe, PipeTransform } from '@angular/core';
const moment = require('moment');
@Pipe({name: 'timeZoneSync'})
export class TimeZoneSyncPipe implements PipeTransform {
constructor() { }
transform(value) {
if (value) {
return moment(value).add(6, 'hours').format("MM/DD/YYYY");
}
}
}
在我看来,我正在使用这样的两个管道:
<input class="app-input" [ngModel]="client.dob | timeZoneSync | date:'medium'"
(ngModelChange)="client.dob=$event" name="inputField" type="text" />
【问题讨论】:
-
看起来您提供给 moment 的日期
value不是 ISO 或 RFC2822 格式。 -
什么是
value?可以分享一下吗,好像是这个问题 -
究竟是什么让您感到惊讶?
date:'medium'不会产生任何一种所需的格式。你为什么还要使用它;为什么取一个日期然后将其格式化为字符串然后将其解析回日期然后再次将其格式化为字符串? -
@jonsharpe 要回答您的问题,我希望日期采用便于阅读的格式。所以日期管道需要 1981-09-24T05:00:00.000Z 并给我一个用户友好的格式。但后来我使用 moment 将小时数添加到日期以解决时区同步问题。
-
“解决时区同步问题” - 现在这看起来像是XY problem,因为仅仅添加一个固定的偏移量并不是处理本地化日期时间的方法。接受的答案并不能解决这个问题。调查例如Moment Timezone。是的,看到有人明显忽略了他们发布的错误消息,没有仔细考虑他们编写的代码实际上做了什么,这令人恼火。如果不出意外,因为这正是您应该在创建minimal reproducible example 时要做的事情。 SO也会自动完成我的实际用户名。
标签: javascript angular date momentjs