将模型从 Angular 6 提交到 Web API 后,日期变得晚了一 (1) 天
Date becomes one (1) day behind after submitting model from Angular 6 to Web API
我正在使用 Angular 6 和 PrimeNG 前端开发控件和 ASP.Net Web API 和 SQL 服务器 用于后端开发。
在我的一个表单中,有两个 PrimeNG Calender 控件用于将开始日期和结束日期保存到数据库中。提交表单后,收集所有表单字段以填充 object/model 并将此模型传递到 Web API。 object/model 使用 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;
}
这是我使用 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;
现在的问题是当模型被传递到 Web 时 API,From Date 和 End Date 值变得少了 1 天 我不知道为什么.我已经调试了我的 Angular 6 代码,看到它通过了我选择的确切日期,但是当这个模型到达 Web API 时,日期变得晚了 1 天。
谁能描述一下为什么会出现这个问题以及如何解决这个问题?
一个可能的罪魁祸首是客户端和服务器之间的时区偏移。
当通过 Angular HTTP 客户端发送 JavaScript 日期时,使用 JSON.stingify() 方法将数据转换为 JSON 字符串。这个converts all dates into strings using ISO 8601 format,像这样:
YYYY-MM-DDTHH:mm:ss.sssZ
此格式的一个令人困惑的方面是末尾字母 Z 的用途,它代表 Zulu,或零 UTC 时区偏移量。
当日期转换为该字符串时,数值时间值实际上被修改为反映无时区偏移,而不是客户端的时区偏移。这是为了在服务器处于不同时区的情况下规范化实际时间。
重要的是确保 Web API 设置为根据零 UTC 偏移量解释时间的字符串值表示。
要解决此问题,您需要将日期转换为 "MM/DD/YYYY" 格式,
在 Angular 应用程序的 .ts 文件中按照以下步骤操作,
1) 像
一样导入 DatePipe
import { DatePipe } from '@angular/common';
2) 在构造函数中添加以下内容
private datePipe: DatePipe
3) 使用 transform 转换日期,
this.StartDate = this.datePipe.transform(this.todayDate, 'MM/dd/yyyy');
注意:日期变量应该是任何类型。
angular 客户端更改 HTTP 请求的负载日期格式。我解决了我的问题,将其添加到我的模块提供商中:
{ provide: MAT_DATE_LOCALE, useValue: 'en-GB' }, /* optional */
{ provide: MAT_MOMENT_DATE_ADAPTER_OPTIONS, useValue: { useUtc: true } },
并像这样导入:
import {MAT_MOMENT_DATE_ADAPTER_OPTIONS} from '@angular/material-moment-adapter';
import { MAT_DATE_LOCALE } from "@angular/material/core";
最后将其添加到您的模块导入部件和自动导入中
import: [MatDatepickerModule,MatMomentDateModule]
你的问题也解决了,希望 :)
我有一个格式为 'DD/MM/YYY' 的字符串,在将其发送到 WebApi 服务器之前,我必须将其转换为 Date 类型。
所以我使用 moment.js 库将它转换为 UTC 日期。
Angular 发送日期类型请求字段。
WebApi (c#) 得到了 DateTyme 类型的请求字段。
Day-reduced 问题解决:)
这是我对字符串“26/01/2005”的代码:
moment.utc("26/01/2005", "DD/MM/YYYY").toDate()
要通过 npm 安装 moment.js,请使用:
npm install moment --save
有关 moment.js 的更多详细信息,您可以在 https://momentjs.com/
中找到
我的时区是 GMT +6:00(孟加拉国时间)。
在同样的情况下,我的问题通过使用这样的时刻格式解决了。
moment().format('YYYY-MM-DDThh:mm:ssZ');
使用内部 Angular:
import * as moment from 'moment';
currentDate : any = moment().format('YYYY-MM-DDThh:mm:ssZ');
ngOnInit() {
console.log(this.currentDate);
}
输出:
2022-03-22T12:31:47+06:00
要通过 npm 安装 moment.js,请使用:
npm install moment --save
我正在使用 Angular 6 和 PrimeNG 前端开发控件和 ASP.Net Web API 和 SQL 服务器 用于后端开发。
在我的一个表单中,有两个 PrimeNG Calender 控件用于将开始日期和结束日期保存到数据库中。提交表单后,收集所有表单字段以填充 object/model 并将此模型传递到 Web API。 object/model 使用 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;
}
这是我使用 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;
现在的问题是当模型被传递到 Web 时 API,From Date 和 End Date 值变得少了 1 天 我不知道为什么.我已经调试了我的 Angular 6 代码,看到它通过了我选择的确切日期,但是当这个模型到达 Web API 时,日期变得晚了 1 天。
谁能描述一下为什么会出现这个问题以及如何解决这个问题?
一个可能的罪魁祸首是客户端和服务器之间的时区偏移。
当通过 Angular HTTP 客户端发送 JavaScript 日期时,使用 JSON.stingify() 方法将数据转换为 JSON 字符串。这个converts all dates into strings using ISO 8601 format,像这样:
YYYY-MM-DDTHH:mm:ss.sssZ
此格式的一个令人困惑的方面是末尾字母 Z 的用途,它代表 Zulu,或零 UTC 时区偏移量。
当日期转换为该字符串时,数值时间值实际上被修改为反映无时区偏移,而不是客户端的时区偏移。这是为了在服务器处于不同时区的情况下规范化实际时间。
重要的是确保 Web API 设置为根据零 UTC 偏移量解释时间的字符串值表示。
要解决此问题,您需要将日期转换为 "MM/DD/YYYY" 格式,
在 Angular 应用程序的 .ts 文件中按照以下步骤操作,
1) 像
一样导入 DatePipeimport { DatePipe } from '@angular/common';
2) 在构造函数中添加以下内容
private datePipe: DatePipe
3) 使用 transform 转换日期,
this.StartDate = this.datePipe.transform(this.todayDate, 'MM/dd/yyyy');
注意:日期变量应该是任何类型。
angular 客户端更改 HTTP 请求的负载日期格式。我解决了我的问题,将其添加到我的模块提供商中:
{ provide: MAT_DATE_LOCALE, useValue: 'en-GB' }, /* optional */
{ provide: MAT_MOMENT_DATE_ADAPTER_OPTIONS, useValue: { useUtc: true } },
并像这样导入:
import {MAT_MOMENT_DATE_ADAPTER_OPTIONS} from '@angular/material-moment-adapter';
import { MAT_DATE_LOCALE } from "@angular/material/core";
最后将其添加到您的模块导入部件和自动导入中
import: [MatDatepickerModule,MatMomentDateModule]
你的问题也解决了,希望 :)
我有一个格式为 'DD/MM/YYY' 的字符串,在将其发送到 WebApi 服务器之前,我必须将其转换为 Date 类型。 所以我使用 moment.js 库将它转换为 UTC 日期。
Angular 发送日期类型请求字段。 WebApi (c#) 得到了 DateTyme 类型的请求字段。 Day-reduced 问题解决:)
这是我对字符串“26/01/2005”的代码:
moment.utc("26/01/2005", "DD/MM/YYYY").toDate()
要通过 npm 安装 moment.js,请使用:
npm install moment --save
有关 moment.js 的更多详细信息,您可以在 https://momentjs.com/
中找到我的时区是 GMT +6:00(孟加拉国时间)。 在同样的情况下,我的问题通过使用这样的时刻格式解决了。
moment().format('YYYY-MM-DDThh:mm:ssZ');
使用内部 Angular:
import * as moment from 'moment';
currentDate : any = moment().format('YYYY-MM-DDThh:mm:ssZ');
ngOnInit() {
console.log(this.currentDate);
}
输出:
2022-03-22T12:31:47+06:00
要通过 npm 安装 moment.js,请使用:
npm install moment --save