Angular 5 和 .NET Core 2.1 API:获取用户时区的当前时间

这可行,但我想知道是否有人有更好的方法。


目标:


获取客户端的 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 });

  }

}

然后在后端,我拉入标头值,将其转换为整数,然后使用该AddMinutes功能将 UTC 时间转换为本地时间。


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 到本地转换?


收到一只叮咚
浏览 278回答 2
2回答

斯蒂芬大帝

确保将每个时间戳作为 UTC 发送给客户端。类似于“2018-12-12T20:13:00.000Z”。如果将其转换为 JavaScript 日期,它应该会自动显示在浏览器的本地时区中。

守候你守候我

您可以通过 NuGet安装TimeZoneConverter 。然后,如果您设法在标头中传递时区信息,例如Europe/Berlin,您可以在后端执行以下操作:using TimeZoneConverter;...string timezoneString = "Europe/Berlin";TimeZoneInfo timezone = TZConvert.GetTimeZoneInfo(timezoneString);Console.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, timezone));
打开App,查看更多内容
随时随地看视频慕课网APP