【问题标题】:Different time zones for Azure web appAzure Web 应用的不同时区
【发布时间】:2018-12-11 19:54:04
【问题描述】:

我们有一个在英国北部运行的网络应用程序,我们在应用程序设置中使用WEBSITE_TIME_ZONE 明确指定了一个时区。它是一个具有共享数据库架构的多租户 SaaS 应用程序。现在我们有一个来自美国的新客户,他将使用该应用程序。但在不同的时区,它正在更改存储在数据库中的日期和时间。

让应用在不同时区正常运行的最佳做法应该是什么?我应该为每个时区部署一个单独的网站还是应该在代码中处理它?

【问题讨论】:

  • 始终将日期存储在 Coordinated Universal Time (UTC) 中。显示信息时,可以根据用户所在位置进行格式化。
  • 虽然这个问题对于 Stack Overflow 来说有点宽泛和固执己见,因为对此没有“特定”的正确答案,并且有正当理由存储本地时间内容:存储多个时区只是添加您需要处理的事情,而不是将所有内容存储为 UTC 并在选择的时区本地查看。我会听从@rickvdbosch 的建议,省去很多麻烦。
  • 感谢您的回复。所以基本上,就我而言,因为我已经设置了使用 GMT 时区的 Web 服务器,所以我需要先从 GMT 转换为 UTC,然后再将其转换回用户的位置。原因是,此时我无法更改网站的时区,因为它会影响所有现有数据。然后我需要弄清楚如何获取用户的位置并动态更改 web.config?
  • @rickvdbosch - 通常是的,但也有一些极端情况,例如未来事件的安排,其中事件本地时区更可取。此外,整个日期(例如生日)通常是无时间存储的,因此在解释时应用时区而不是在存储时应用时区。只是指出要小心“始终使用 UTC”的建议 - 需要考虑上下文。 :)

标签: azure web-applications timezone


【解决方案1】:

一些事情:

  • 无论语言或平台如何,服务器端代码的最佳做法是独立于时区。这意味着不会对单个时区进行任何硬编码的依赖,无论是来自配置文件、托管设置还是服务器设置。

    • 对于 .NET 代码,这意味着您永远不应使用 DateTime.NowDateTimeKind.LocalTimeZoneInfo.Local 和相关 API,因为它们的时区来自服务器设置。
  • 改为使用适用于 UTC 和/或特定时区或时区偏移的 API。

    • 对于 .NET 代码,这意味着使用 DateTime.UtcNowDateTimeOffsetTimeZoneInfo.ConvertTimeTimeZoneInfo.FindSystemTimeZoneById 和其他一些代码。或者,考虑使用Noda Time,它提供了更全面和一致的 API。
  • 通常,应用程序应将用户的时区和/或位置作为单独的字段进行跟踪,以字符串时区标识符的形式存储,采用 Windows 时间格式或 IANA 时区格式。阅读the timezone tag wiki了解更多详情(标题为“时区数据库”的部分)。

  • 关于WEBSITE_TIME_ZONE 设置:仅在以下所有为真时使用:

    • 您正在托管使用系统本地时区的应用程序。比如可以通过调用DateTime.Now获取当前时间。
    • 应用程序的所有用户始终处于同一时区。
    • 无论出于何种原因,您都不能对应用程序进行更改以使其与时区无关。

我个人认为WEBSITE_TIME_ZONE 设置不应该存在。在适当设计的应用程序中不需要它。它是一种拐杖,应谨慎使用,仅作为最后的手段。

【讨论】:

  • 感谢@Matt 提供的所有信息,这非常有帮助。但是,在开发应用程序之前似乎应该考虑所有这些,对于具有明确指定时区并使用 .Net 代码(如 DateTime.Now)的现有应用程序,您有什么建议?
  • 搜索替换/g
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 2018-11-10
相关资源
最近更新 更多