首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从angular发送并在ASP.NET服务器中接收时,日期值会发生变化

从angular发送并在ASP.NET服务器中接收时,日期值会发生变化
EN

Stack Overflow用户
提问于 2019-02-18 01:40:39
回答 2查看 2.5K关注 0票数 2

我将一个包含来自Angular 6的两个日期的对象发送到ASP.NET Core Web API方法。Angular方面的日期是正确的,但是当在Web API方法中接收到这些日期时,它们比Angular应用程序发送的日期晚了一天。

代码语言:javascript
复制
startSprint(id: number, SprintDates: any): Observable<any> {
    this.sprintId = id.toString();
    return this.http.patch<any>(this.baseUrl + 'setSprintDates/' + this.sprintId,
                                SprintDates);
}

上面的方法将dates对象发送到Web API方法。下面的方法是接收该对象的Web API方法,但是当我调试并将光标悬停在sprintDatesDto对象上时,收到的值比从Angular发送的值晚了一天。

代码语言:javascript
复制
[HttpPatch("setSprintDates/{sprintId}")]
public async Task<IActionResult> SetSprintDates(string sprintId, SprintDatesDto sprintDatesDto)
{
    // Business login related code
    return StatusCode(200);
}

这是SprintDatesDto类:

代码语言:javascript
复制
namespace AgileFootPrints.API.Dtos
{
    public class SprintDatesDto
    {
        public DateTime StartDate { get; set; }
        public DateTime EndDate { get; set; }
    }
}

这是我在angular Typescript文件中创建的对象:

代码语言:javascript
复制
sprinDates = {
startDate: Date,
endDate: Date
  };

然后,在下面的Html文件中,我使用ngModel绑定到sprintDates对象属性:

代码语言:javascript
复制
<div class="row">
  <div class="col-md-7 w-100 ">
<mat-form-field class="example-full-width">
  <input
    matInput
    [(ngModel)]="sprinDates.startDate"
    [min]="minDate"
    [max]="maxDate"
    [matDatepicker]="startsAt"
    placeholder="Starts At"
  />
  <mat-datepicker-toggle matSuffix [for]="startsAt"></mat-datepicker-toggle>
  <mat-datepicker #startsAt></mat-datepicker>
</mat-form-field>
  </div>
  <br />
</div>
<div class="row">
  <div class="col-md-7 w-100">
<mat-form-field class="example-full-width">
  <input
    [disabled]="sprinDates.startDate === undefined"
    matInput
    [(ngModel)]="sprinDates.endDate"
    [min]="sprinDates.startDate"
    [max]="maxDate"
    [matDatepicker]="endsAt"
    placeholder="Ends At"
  />
  <mat-datepicker-toggle matSuffix [for]="endsAt"></mat-datepicker-toggle>
  <mat-datepicker #endsAt></mat-datepicker>
</mat-form-field>
  </div>
</div>
EN

回答 2

Stack Overflow用户

发布于 2020-10-07 21:04:06

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

当通过Angular HTTP客户端发送JavaScript日期时,使用JSON.stingify()方法将数据转换为JSON字符串。当日期转换为此字符串时,数值时间值实际上被修改为不反映时区偏移,而不是客户端的时区偏移。这是为了标准化实际时间,以防服务器处于不同的时区。

要解决此问题,您需要将日期时间转换为服务器可以解释的字符串格式。为此,有两种方法。您可以使用angular中的DatePipe,也可以使用可用的日期函数将日期转换为字符串。

代码语言:javascript
复制
import { DatePipe } from '@angular/common';

在构造函数中:

代码语言:javascript
复制
private datePipe: DatePipe

转换为您需要的任何日期时间格式。

代码语言:javascript
复制
this.sprinDates.StartDate = this.datePipe.transform(this.sprinDates.StartDate, 'MM/dd/yyyy');

我提到的另一种方法是使用日期函数进行转换。

代码语言:javascript
复制
this.sprinDates.StartDate = this.sprinDates.StartDate ? this.sprinDates.StartDate.toLocaleString() : null;
票数 3
EN

Stack Overflow用户

发布于 2019-02-18 03:15:23

问题在于Json解析日期的方式,默认情况下,在angular中,它会添加与协调时相比的本地时间(例如:如果您在午夜使用Gmt+1,它将转换为昨天协调时的晚上11点),您需要做的是创建一个文件,该文件将覆盖MomentDateAdapter以忽略此转换,并以协调时创建选定的时间,如下所示:

代码语言:javascript
复制
import { Inject, Injectable, Optional } from '@angular/core';
import { MAT_DATE_LOCALE } from '@angular/material';
import { MomentDateAdapter } from '@angular/material-moment-adapter';
import { Moment } from 'moment';
import * as moment from 'moment';

@Injectable()
export class MomentUtcDateAdapter extends MomentDateAdapter {
  constructor(@Optional() @Inject(MAT_DATE_LOCALE) dateLocale: string) {
    super(dateLocale);
  }

  createDate(year: number, month: number, date: number): Moment {
    // Moment.js will create an invalid date if any of the components are out of bounds, but we
    // explicitly check each case so we can throw more descriptive errors.
    if (month < 0 || month > 11) {
      throw Error(
        `Invalid month index "${month}". Month index has to be between 0 and 11.`
      );
    }

    if (date < 1) {
      throw Error(`Invalid date "${date}". Date has to be greater than 0.`);
    }

    const result = moment.utc({ year, month, date }).locale(this.locale);

    // If the result isn't valid, the date must have been out of bounds for this month.
    if (!result.isValid()) {
      throw Error(`Invalid date "${date}" for month with index "${month}".`);
    }

    return result;
  }
}

接下来,只需将以下提供程序和这个新文件导入到您的app.module或angular材质模块的导入中

代码语言:javascript
复制
@NgModule({
  providers: [
    { provide: MAT_DATE_LOCALE, useValue: 'en-GB' },
      { provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS },
      { provide: DateAdapter, useClass: MomentUtcDateAdapter },
  ],
  imports: [
   MomentUtcDateAdapter,
   ... rest of your imports]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54735868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档