API Angular 5 и .NET Core 2.1: получение текущего времени в часовом поясе пользователя - PullRequest
0 голосов
/ 12 декабря 2018

Это работает, но мне было интересно, есть ли у кого-нибудь лучший метод.

Цель:

Получить смещение DateTime клиента и вернуть значения DateTime по местному времени клиента.

Что я сделал:

На внешнем интерфейсе я создал собственный заголовок и передал его в запросе.

export class ItemService {
  baseUrl = environment.apiUrl;
  httpOptions = {
    headers: new HttpHeaders({
      'Content-Type': 'application/json',
      'TimeZone-Offset': `${new Date().getTimezoneOffset()}`
    })
  }

  constructur(private authHttp: HttpClient) { }

  getItems() {
    return this.authHttp.get<Item[]>(this.baseUrl + 'items', 
      { headers: this.httpOptions.headers });
  }
}

Затем насерверная часть, я вытащил значение заголовка, преобразовал его в целое число, затем преобразовал время UTC в местное, используя функциональность AddMinutes.

public class ItemsController : Controller
{
  [HttpGet]
  public async Task<IActionResult> GetItems()
  {
    var currentTime = DateTime.UtcNow.AddMinutes(int.Parse(
      Request.Headers["TimeZone-Offset"] != StringValues.Empty
        ? Request.Headers["TimeZone-Offset"][0] : "0"));

    // ...logic to return items
  }

Итак, если добавлен заголовок TimeZone-Offsetсервер сможет конвертировать DateTimes в местное время клиента, в противном случае DateTimes будет указан в UTC.Есть ли способ лучше?Должен ли я просто оставить все UTC на сервере, а затем выполнить преобразование UTC в локальное на стороне клиента?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Убедитесь, что вы отправляете каждую метку времени как UTC клиенту.Что-то вроде «2018-12-12T20: 13: 00.000Z».Если вы преобразуете это в дату JavaScript, она должна автоматически отображаться в местном часовом поясе браузера.

0 голосов
/ 12 декабря 2018

Вы можете установить TimeZoneConverter через NuGet.Затем, если вам удастся передать в своем заголовке информацию о часовом поясе, такую ​​как Europe/Berlin, вы можете сделать следующее в своем бэкэнде:

using TimeZoneConverter;
...
string timezoneString = "Europe/Berlin";
TimeZoneInfo timezone = TZConvert.GetTimeZoneInfo(timezoneString);
Console.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, timezone));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...