如何设置 NSwag openapi2tsclient 以生成正确的 Datetime init 函数?
How can I setup NSwag openapi2tsclient to generate correct Datetime init function?
我在 React 中有一个 BE API (.NET 5.0) 和 FE。我正在使用 NSwag 生成 swagger.json 文件,然后 openapi2tsclient 将其转换为打字稿文件。一切正常。我有一个带有 UTC 日期时间的基本实体。它被翻译成 swagger.json 文件为:
"creationDate": {
"type": "string",
"format": "date-time"
},
这个对象在我生成的 ts 文件中初始化如下:
export class BaseEntity implements IBaseEntity {
id!: string;
creationDate!: Date;
modifiedDate!: Date;
createdBy!: string;
modifiedBy!: string;
constructor(data?: IBaseEntity) {
if (data) {
for (var property in data) {
if (data.hasOwnProperty(property))
(<any>this)[property] = (<any>data)[property];
}
}
}
init(_data?: any) {
if (_data) {
this.id = _data["id"];
this.creationDate = _data["creationDate"] ? new Date(_data["creationDate"].toString()) : <any>undefined;
this.modifiedDate = _data["modifiedDate"] ? new Date(_data["modifiedDate"].toString()) : <any>undefined;
this.createdBy = _data["createdBy"];
this.modifiedBy = _data["modifiedBy"];
}
}
static fromJS(data: any): BaseEntity {
data = typeof data === 'object' ? data : {};
let result = new BaseEntity();
result.init(data);
return result;
}
toJSON(data?: any) {
data = typeof data === 'object' ? data : {};
data["id"] = this.id;
data["creationDate"] = this.creationDate ? this.creationDate.toISOString() : <any>undefined;
data["modifiedDate"] = this.modifiedDate ? this.modifiedDate.toISOString() : <any>undefined;
data["createdBy"] = this.createdBy;
data["modifiedBy"] = this.modifiedBy;
return data;
}
}
但现在我的 creationDate 时间不再是 UTC 而是 GMT。
数据库中的日期时间:“2022-02-19 17:49:04.5360786”
初始化前的原始时间(来自 BE 的字符串):“2022-02-19T17:49:04.5360786”
初始化函数后的创建日期:2022 年 2 月 19 日,星期六 17:49:04 GMT+0100(欧洲中部标准时间)
为了显示时间,我使用了 react-moment 包。当我不使用打字稿并且我的日期时间从 BE 变为字符串时,我可以使用此代码显示正确的时间:
<Moment utc local format="DD. MM. YYYY HH:mm">
{item.creationDate}
</Moment>
19. 02. 2022 18:49 //correct time
但是当我使用 typescript 项目时。我的 creationDate 不再只是字符串,而是转换后的日期 我弄错时间了:
19. 02. 2022 17:49 // not correct time
有没有办法设置 NSwag openapi2tsclient 以生成正确的打字稿文件?或者有什么办法可以解决这个问题?
我发现这不是 UTC 时间的正确表示
"2022-02-19T17:49:04.5360786"
结尾应该有一个“Z”。
"2022-02-19T17:49:04.5360786Z"
所以我的后端发送了正确的 UTC 时间,但最后没有 Z。当 JS 试图将它转换为 new Date() 时,它假定它不是 UTC 时间。我最终通过以下方式将所有传出日期时间的序列化设置为 Startup.cs 中的 UTC:
services.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;
});
现在可以正常工作了。
我在 React 中有一个 BE API (.NET 5.0) 和 FE。我正在使用 NSwag 生成 swagger.json 文件,然后 openapi2tsclient 将其转换为打字稿文件。一切正常。我有一个带有 UTC 日期时间的基本实体。它被翻译成 swagger.json 文件为:
"creationDate": {
"type": "string",
"format": "date-time"
},
这个对象在我生成的 ts 文件中初始化如下:
export class BaseEntity implements IBaseEntity {
id!: string;
creationDate!: Date;
modifiedDate!: Date;
createdBy!: string;
modifiedBy!: string;
constructor(data?: IBaseEntity) {
if (data) {
for (var property in data) {
if (data.hasOwnProperty(property))
(<any>this)[property] = (<any>data)[property];
}
}
}
init(_data?: any) {
if (_data) {
this.id = _data["id"];
this.creationDate = _data["creationDate"] ? new Date(_data["creationDate"].toString()) : <any>undefined;
this.modifiedDate = _data["modifiedDate"] ? new Date(_data["modifiedDate"].toString()) : <any>undefined;
this.createdBy = _data["createdBy"];
this.modifiedBy = _data["modifiedBy"];
}
}
static fromJS(data: any): BaseEntity {
data = typeof data === 'object' ? data : {};
let result = new BaseEntity();
result.init(data);
return result;
}
toJSON(data?: any) {
data = typeof data === 'object' ? data : {};
data["id"] = this.id;
data["creationDate"] = this.creationDate ? this.creationDate.toISOString() : <any>undefined;
data["modifiedDate"] = this.modifiedDate ? this.modifiedDate.toISOString() : <any>undefined;
data["createdBy"] = this.createdBy;
data["modifiedBy"] = this.modifiedBy;
return data;
}
}
但现在我的 creationDate 时间不再是 UTC 而是 GMT。
数据库中的日期时间:“2022-02-19 17:49:04.5360786”
初始化前的原始时间(来自 BE 的字符串):“2022-02-19T17:49:04.5360786”
初始化函数后的创建日期:2022 年 2 月 19 日,星期六 17:49:04 GMT+0100(欧洲中部标准时间)
为了显示时间,我使用了 react-moment 包。当我不使用打字稿并且我的日期时间从 BE 变为字符串时,我可以使用此代码显示正确的时间:
<Moment utc local format="DD. MM. YYYY HH:mm">
{item.creationDate}
</Moment>
19. 02. 2022 18:49 //correct time
但是当我使用 typescript 项目时。我的 creationDate 不再只是字符串,而是转换后的日期 我弄错时间了:
19. 02. 2022 17:49 // not correct time
有没有办法设置 NSwag openapi2tsclient 以生成正确的打字稿文件?或者有什么办法可以解决这个问题?
我发现这不是 UTC 时间的正确表示
"2022-02-19T17:49:04.5360786"
结尾应该有一个“Z”。
"2022-02-19T17:49:04.5360786Z"
所以我的后端发送了正确的 UTC 时间,但最后没有 Z。当 JS 试图将它转换为 new Date() 时,它假定它不是 UTC 时间。我最终通过以下方式将所有传出日期时间的序列化设置为 Startup.cs 中的 UTC:
services.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;
});
现在可以正常工作了。