如何设置 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;
            });

现在可以正常工作了。