【问题标题】:Angular 5 and .NET Core 2.1 API: Getting current time in user's timezoneAngular 5 和 .NET Core 2.1 API:获取用户时区的当前时间
【发布时间】:2019-05-13 21:44:55
【问题描述】:

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

目标:

获取客户端的 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 到本地转换?

【问题讨论】:

  • 嗨,杰德。我认为最好在服务器端以 UTC 保存日期时间。然后在客户端转换为本地(您可以使用 moment.js)。在我所有的项目中,我都使用这种情况。

标签: c# angular datetime asp.net-core-2.1


【解决方案1】:

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

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

【讨论】:

  • 我认为您在这里混合了 IANA 时区和 Windows 时区。 TimeZoneInfo 与 Windows 中的 timeZoneId 一起使用。类似于“西欧标准时间”。而“Europe/Berlin”是 IANA 时区。
  • @keuleJ 谢谢!你是对的 - 因为我的操作系统而碰巧为我工作。编辑为使用 TimeZoneConverter。
【解决方案2】:

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

【讨论】:

  • 这就是我一直在争论的问题......这就是我的应用程序实际所做的。但是,我喜欢能够在客户端本地时间发回 DateTimes 的想法,因为 Postman 等一些 API 调用服务没有为您进行转换的功能。显然,如果最终用户正在为 API 创建自己的接口,那么他们应该能够自己进行转换。这只是我一直在考虑的事情。
  • 但是,既然我专门问了这个关于 Angular 的问题,你可能是对的!
猜你喜欢
  • 1970-01-01
  • 2019-06-01
  • 2012-07-15
  • 2017-04-30
  • 2019-03-14
  • 2019-12-15
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
相关资源
最近更新 更多