14

我有一个在客户端具有 Date 类型属性的对象。当我尝试通过将对象发送HttpClient.post到服务器时,属性的值更改为 UTC 时区。

客户端值为Sun Nov 26 2017 00:00:00 GMT+0300(土耳其标准时间),但当它进入服务器时,更改为:25.11.2017 21:00:00

我该如何控制这个?

这是我的课。

export interface IBill {
   BillID : number;
   SubscriptionID:number;
   SiteID : number;
   SubscriptionName: string;
   Amount: number;
   Date: Date;
   PaymentDeadline: Date;
   Virtual: boolean;
   Portioned: boolean;
   Issuanced: boolean;
   FinancialTransactionComment : string;}

我在填写 ng-form 时创建了一个对象,然后调用以下 Http.post :

let bill = this.formData;
this.http.post(this.configuration.ServerWithApiUrl + url, bill , { headers: headers, withCredentials: true, observe: "response", responseType: 'text' })
        .map((response) => {
            return this.parseResponse(response);
        }).catch(
        (err) =>
            this.handleError(err));
4

2 回答 2

21

使用 HttpInterceptor 修改 put/post 请求的请求正文。通过创建更正的 Date 对象递归更新所有日期字段。

示例代码:

@Injectable() export class UpdateDateHttpInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    this.startLoading();
    if (req.method === 'POST' || req.method === 'PUT') {
        this.shiftDates(req.body);
    }
  }

  shiftDates(body) {
    if (body === null || body === undefined) {
        return body;
    }

    if (typeof body !== 'object') {
        return body;
    }

    for (const key of Object.keys(body)) {
        const value = body[key];
        if (value instanceof Date) {
            body[key] = new Date(Date.UTC(value.getFullYear(), value.getMonth(), value.getDate(), value.getHours(), value.getMinutes()
                , value.getSeconds()));
        } else if (typeof value === 'object') {
            this.shiftDates(value);
        }
    }
  }
于 2018-10-05T10:57:19.503 回答
9

我将Date类型、PaymentDeadline 更改为字符串。

export interface IBill {
   BillID : number;
   SubscriptionID:number;
   SiteID : number;
   SubscriptionName: string;
   Amount: number;
   Date: string;
   PaymentDeadline: string;
   Virtual: boolean;
   Portioned: boolean;
   Issuanced: boolean;
   FinancialTransactionComment : string; }

并在发送到服务之前重写它们。

let bill = this.formData;
bill.Date = this.formData.Date.toLocaleString();
bill.PaymentDeadline = this.formData.PaymentDeadline.toLocaleString();

在这种情况下,时间将作为字符串发送(“11/10/2017, 12:00:00 AM”)并且不会对 UTC 时区进行任何更改

于 2017-11-28T12:42:43.357 回答