Javascript Angular应用程序中的Resolving Moment.js弃用警告
我在Angular应用程序中使用moment.js获得以下代码的警告:Javascript Angular应用程序中的Resolving Moment.js弃用警告,javascript,angular,date,momentjs,Javascript,Angular,Date,Momentjs,我在Angular应用程序中使用moment.js获得以下代码的警告: moment(value).add(6, 'hours').format("MM/DD/YYYY"); 打印到控制台的警告/错误为: moment.js:293弃用警告:提供的值不在 公认的RFC2822或ISO格式。建筑回到js的那一刻 Date(),它在所有浏览器和版本中都不可靠。不 不鼓励使用RFC2822/ISO日期格式,并将在 即将发布的主要版本。请参阅 更多信息。 参数:[0]\u IsamentintObje
moment(value).add(6, 'hours').format("MM/DD/YYYY");
打印到控制台的警告/错误为:
moment.js:293弃用警告:提供的值不在
公认的RFC2822或ISO格式。建筑回到js的那一刻
Date(),它在所有浏览器和版本中都不可靠。不
不鼓励使用RFC2822/ISO日期格式,并将在
即将发布的主要版本。请参阅
更多信息。
参数:[0]\u IsamentintObject:true、\u isUTC:false、\u useUTC:false、,
_l:未定义,_i:2007年4月10日,晚上10:00:00,_f:未定义,_strict:未定义,_locale:[对象]
我已经查看了警告中链接的文档页面,但是我仍然不清楚我需要做哪些更改来消除弃用警告。例如,我尝试添加一个空数组作为第二个参数:
moment(value, []).add(6, 'hours').format("MM/DD/YYYY");
…但尽管这样可以消除错误,但我会在视图中打印“无效日期”,而不是实际日期。我需要如何调整这里的语法以消除警告
更新:提供的值是使用角度日期管道转换的UTC值。因此,我将通过两个管道:首先是角度日期管道,然后是使用力矩的自定义管道。完整管道代码如下所示:
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" />
在我看来,我使用的两条管道如下:
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" />
您的错误消息中有一个链接。它间接地将您引导到以下方面: 引用: 不推荐使用非iso字符串进行力矩构造。这意味着你可以安全地做 力矩(“2014-04-25T01:32:21.196Z”);//iso字符串,utc时区 力矩(“2014-04-25T01:32:21.196+0600”);//带时区的iso字符串 力矩(“2014年4月25日”,“年-月-日”);//带格式的字符串 但您不能可靠地完成(因此它被弃用) 时刻(“2014/04/25”) 时刻(“2014年4月24日星期四12:32:21 GMT-0700(PDT)” 矩(“一些看起来像日期的随机字符串”) 基本上,为您的
时区syncippe
提供值的任何东西都不能很好地确保日期是ISO
或RFC2822
格式
更具体地说
'mediumDate'
参数相当于'MMM d,y'
(例如2015年6月15日
),它甚至不接近ISO
修复
尝试使用类似于“client.dob | date:'yyyyy-MM-ddTHH:MM:ss.sssZ'| timeZoneSync”
树后森林
@乔尔沙普说得很对!我的回答解释了你看到错误的“原因”。但是乔恩问了一个更好的问题。为什么要继续翻译日期
示例
const parsedDate = moment("1981-09-24T05:00:00.000Z");
console.log(parsedDate.format("YYYY/MM/DD"));
看起来您提供给moment的日期
值
不是ISO或RFC2822格式。什么是值
?你能和我分享一下吗,似乎这就是问题所在,到底是什么让你感到惊讶<代码>日期:'medium'不生成任何所需格式。你为什么还要用它;为什么要将日期格式化为字符串,然后再将其解析为日期,然后再将其格式化为字符串?@jonsharpe回答你的问题,我希望日期的格式对读者友好。因此,日期管道采用1981-09-24T05:00:00.000Z,并提供了一种用户友好的格式。但是,我用moment向日期添加小时数来解决时区同步问题。“解决时区同步问题”-现在这看起来像是一个问题,因为仅仅添加固定偏移量并不是处理本地化日期时间的方法。公认的答案并不能解决这个问题;调查。是的,看到有人显然忽略了他们发布的错误消息,而没有思考他们编写的代码的实际用途,这是令人恼火的;如果没有别的,因为这正是你应该做的,作为创造一个世界的一部分。同样,我的实际用户名也会自动完成。它很好地完成了OP所要求的内容,而不是这两种格式中的任何一种。我希望日期以读者友好的格式显示。因此,日期管道采用1981-09-24T05:00:00.000Z,并提供了一种用户友好的格式来显示在视图中。但随后我使用moment将时间添加到日期,以解决时区同步问题。@Ademo您可能希望按照不同的顺序执行操作:client.dob | timeZoneSync | date:'medium'
,即:首先,更正日期
;第二,把它翻译成字符串。事实上,您可以在时区同步管道中丢弃.format(“MM/DD/YYYY”)
。谢谢,我也有同样的想法。现在正在更改订单。不,与示例中提供的日期一致。根据我对这段代码的解释,至少我认为事情应该是这样的