我注意到,当从我的服务器/API(在本例中为asp.net core 3.1)接收数据时,Angular会将一个字符串分配给日期目标字段,而不是将其实际“转换”为日期。
就我目前所知,这不是asp.net核心或“服务器端”的问题。
我做了下面的测试,要么我完全理解这里的错误,要么JSON解析器坏了...(我希望不是)?
//The target interface for testing
export interface DateTesting
{
aText: string;
aDate: Date;
}
//For testing
let input: DateTesting = { aText: "Hello World!", aDate: new Date() };
console.log(JSON.stringify(input)); //-> outputs the "input" object as JSON
let json = JSON.stringify(input); //-> {"aText":"Hello World!","aDate":"2022-07-12T12:01:46.498Z"}
let output: DateTesting = JSON.parse(json);
console.log(output); //-> outputs the object "output"
console.log(typeof output.aDate); //-> is a string! Looks like the parser is broken??
console.log(output.aDate.getDay()); //-> Results in an Error: "Uncaught (in promise): Invalid time"
那么,我在这里遗漏了什么呢?当目标类型是Date时,我可以告诉解析器分配一个日期而不是字符串吗?
我也不认为正确的解决方案是对每个日期字段都执行“Date.parse(whatever)”,这也是因为我希望尽可能保持整个过程的“通用性”。
我使用的是Angular 12.1.2
3条答案
按热度按时间gojuced71#
当目标类型是Date时,我可以告诉json解析器分配一个日期而不是字符串吗?
是的,如果您使用
JSON.parse
方法和可选的reviver
参数,就可以这样做。从文档中 * 如果指定了reiver,解析计算的值在返回之前会进行转换。具体来说,计算值及其所有属性(从最嵌套的属性开始,并继续到原始值本身)单独运行通过reviver。* 因此,在您的特定情况下,您可以指定aDate
属性,并将日期字符串作为新的Date
对象而不是如下所示的字符串返回:cigdeys32#
对于覆盖接口中任何Date属性的通用方法,可以使用此装饰器
然后你可以把这个装饰器放到任何调用API的函数中,所有与定义的regexp匹配的字符串都会被自动解析为Date对象。
kd3sttzy3#
另一个解决方案是编写一个拦截器,它会自动将所有日期字符串转换为Date对象。