Angular2 + C # Web Api - Сохранение даты и времени на сервере с неправильным временем - PullRequest
5 голосов
/ 22 мая 2019

Я пытаюсь сохранить дату и время, но когда веб-интерфейс получает дату, он меняет ее на неправильный часовой пояс.

Возвращение моего углового приложения: Wed May 22 2019 11:03:35 GMT+0200 Но возвращение моего Web Api: 22/05/2019 09:03:35 так что на моей базе данных SQL Server он сохранен неправильно.

Я хочу, чтобы он был сохранен точно 22/05/2019 11:03:35

В моем угловом приложении у меня есть это:

myComponent.component.html

<div class="row">
  <div class="col-4" style="float:left;">
      <div class="form-group">                                
          <div class="input-group">
              <input [ngModel]="newDate | date:'dd/MM/yyyy HH:mm:ss'" 
                  (ngModelChange)="newDate=$event" 
                  name="newDate" 
                  type="datetime"
                  id="new-date"
                  class="form-control">
          </div>
      </div>                    
  </div>
</div>   
<div class="row">
    <div class="col">
        <div class="form-group">                                                                               
            <button type="submit" (click)="onSubmit()" class="btn btn-primary">Submit</button>
        </div>
    </div>            
</div>    
<br>
{{saveDate}}

myComponent.component.ts

import { Component, OnInit, ViewChild, } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnInit  {  
  newDate = Date.now()  
  saveDate: Date;
  ngOnInit() {    
  }

  onSubmit() {
    this.saveDate = new Date(this.newDate);    
    // call web api function
    // ...
    this.reportService.register(this.saveDate).subscribe(() => {});         
  }
}

Это пример стекового блика: https://stackblitz.com/edit/angular-uadhxa

Моя функция веб-API такова:

[ResponseType(typeof(DateTime))]
public async Task<IHttpActionResult> PostDatetime(DateTime _dateTime)
{            
   if (!ModelState.IsValid)
   {
      return BadRequest(ModelState);
   }

   using (db)
   {
      db.Reports.Add(_dateTime);
      await db.SaveChangesAsync();                
   }         

   return CreatedAtRoute("DefaultApi", new { id = report.ReportID }, _dateTime);
}

Я не понимаю, является ли это проблемой из-за того, как я передаю дату и время из углового приложения, или это проблема в моем webapi.

Вы можете мне помочь?Большое вам спасибо

Ответы [ 3 ]

1 голос
/ 22 мая 2019

Используйте DatePipe в компоненте для форматирования даты согласно вашему требованию:

Код TS:

import { Component, OnInit, ViewChild, } from '@angular/core';
import { DatePipe } from '@angular/common'  // Import this

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  providers: [DatePipe] // Add this
})
export class AppComponent implements OnInit {
  newDate = Date.now()
  saveDate: any; // change to any 

  constructor(private datePipe: DatePipe) { } // In constructor
  ngOnInit() {
  }

  onSubmit() {
    this.saveDate = this.datePipe.transform(this.newDate, 'dd/MM/yyyy HH:mm:ss');
    console.log(saveDate ); // and use it as
    // call web api function
    // ...
    //this.reportService.register(this.saveDate).subscribe(() => {});  
  }
}

Working_Demo

0 голосов
/ 22 мая 2019

Я предлагаю сохранить Datetime в вашем бэкэнде C #, как это

  DateTime now = DateTime.Now;
  entity.CreatedDate = now;
0 голосов
/ 22 мая 2019

Вы можете использовать это, чтобы решить вашу проблему

this.saveDate.toLocaleString()

Или вы можете отформатировать в это

var d = new Date();

var curr_date = d.getDate();

var curr_month = d.getMonth();

var curr_year = d.getFullYear();

или

var tzOffset = "+07:00" 
var d = new Date("2017-03-16T17:46:53.677"+ tzOffset);
console.log(d.toLocaleString());
var d = new Date("2017-03-16T17:46:53.677"); //  assumes local time. 
console.log(d.toLocaleString());
var d = new Date("2017-03-16T17:46:53.677Z"); // UTC time
console.log(d.toLocaleString());
...