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

Angular 5 and .NET Core 2.1 API: Getting current time in user's timezone

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

目标:

获取客户​​端的日期时间偏移量和 return 客户端本地时间的日期时间值。

我做了什么:

在 front-end 上,我创建了一个自定义 header 并在请求中传递了它。

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 });
  }
}

然后在 back-end 上,我提取了 header 值,将其转换为整数,然后使用 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 header,服务器将能够将DateTimes 转换为客户端的本地时间,否则,DateTimes 将以UTC 格式给出。有没有更好的办法?我是否应该将所有 UTC 保留在服务器上,然后在 client-side 上进行 UTC 到本地的转换?

您可以通过 NuGet 安装TimeZoneConverter
然后,如果您设法在您的 header 中传递时区信息,例如 Europe/Berlin,您可以在后端执行以下操作:

using TimeZoneConverter;
...
string timezoneString = "Europe/Berlin";
TimeZoneInfo timezone = TZConvert.GetTimeZoneInfo(timezoneString);
Console.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, timezone));

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