将模型从 Angular 6 提交到 Web API 后,日期晚了一 (1) 天

mnu*_*sir 6 datetime asp.net-web-api2 angular6

我正在开发一个 Web 应用程序,使用Angular 6 和 PrimeNG控件进行前端开发,使用ASP.Net Web API 和 SQL Server进行后端开发。

在我的一个表单中,有两个 PrimeNG Calender 控件用于将起始日期和结束日期保存到数据库中。提交表单后,所有表单字段都会被收集以填充对象/模型,并将该模型传递给 Web API。对象/模型是使用 Typescript 代码在 Angular 6 中填充的。下面是我的 Typescript 代码中的前端模型:

export class MyPackage {
    public PackageId: number;
    public PackageUid: number;
    public PackageName: string;
    public PackageDesc: string;
    public ValidFrom: Date;
    public ValidTill: Date;
    public CreatedOn: Date;
}
Run Code Online (Sandbox Code Playgroud)

这是我使用 Angular 6 和 typescript 的对象初始化过程:

let pakg = new MyPackage();
pakg.PackageName = this.packageAddForm.controls["packageName"].value;
pakg.PackageDesc = this.packageAddForm.controls["packageDesc"].value;
pakg.ValidFrom = this.packageAddForm.controls["dateFrom"].value;
pakg.ValidTill = this.packageAddForm.controls["dateEnd"].value;
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当模型传递到 Web API 时,起始日期和结束日期值会减少 1 天,我不知道为什么。我已经调试了我的 Angular 6 代码,发现它传递了我选择的确切日期,但是当该模型到达 Web API 时,日期会晚 1 天。

谁能描述一下为什么会出现这个问题以及如何解决这个问题?

Dal*_*ris 3

一个可能的罪魁祸首是客户端和服务器之间的时区偏移。

当 JavaScript 日期通过 Angular HTTP 客户端发送时,数据将使用 JSON.stingify() 方法转换为 JSON 字符串。这将使用 ISO 8601 格式将所有日期转换为字符串,如下所示:

YYYY-MM-DDTHH:mm:ss.sssZ
Run Code Online (Sandbox Code Playgroud)

这种格式的一个令人困惑的方面是末尾字母 Z 的用途,它代表 Zulu,或零 UTC 时区偏移。

当日期转换为该字符串时,数字时间值实际上被修改为不反映时区偏移,而不是客户端的时区偏移。这是为了在服务器位于不同时区的情况下标准化实际时间。

重要的是确保 Web API 设置为基于零 UTC 偏移来解释时间的字符串值表示形式。