服务器或客户端在发送/接收日期时是否应处理时区?

2022-08-31 01:07:56

我了解最佳做法是将UTC日期/时间存储在我们的数据库中,并以本地时区向用户显示。我们将存储时区而不是偏移量,以便支持夏令时。

哪种方式最适合处理时区?

选项 1:服务器仅呼叫 UTC,客户端转换为时区

以 HTML 格式发送到浏览器的所有日期均采用 UTC 格式。客户端将使用 moment.js 或类似时间将 UTC 时间转换为正确的时区。将使用我们数据库中指定的时区而不是浏览器的本地时间,因为这可能不正确。

当用户提交日期或时间时,必须先将其转换为 UTC 时间,然后再提交到服务器。

选项 2:服务器转换为时区

所有计算仍以 UTC 格式进行,并且日期/时间在最后可能的时刻转换为正确的时区,例如在以 HTML 格式输出日期时。

当客户端提交任何日期/时间时,应立即将其转换为 UTC。

还有别的方法吗?


答案 1

这两种选择都是有效的,但每种方法都有优点和缺点。有几件事需要考虑:

  • JavaScript的原生时区转换仅限于运行它的机器的本地时区,并且它也严重损坏。如果计划在客户端中转换值,则需要此处列出的时区库之一。我个人推荐时刻时区

  • 转换客户端中的值(使用任何库)将需要时区数据,如果要支持世界上的所有时区,这些数据可能会有点大。您可能需要考虑将数据限制为满足您要求的最小子集。

  • 服务器端时区转换还需要有效的时区数据。PHP 内置了这个功能,您可以在 PECL 中更新时区数据库包

  • 您还用 ASP.Net 标记了您的问题。.Net 包含 ,它仅支持 Microsoft 时区。如果你想要标准的IANA时区(就像PHP中使用的时区一样),那么你需要一个库。我推荐野田时间。您可以在时区标签 wiki 中阅读有关不同类型时区的更多信息。TimeZoneInfo

  • 如何交付最终结果取决于您正在编写的应用程序类型。

  • 如果您正在创建一个“传统”网页,其中HTML呈现在服务器端,那么您将呈现一个人类可读的字符串。这意味着不仅要了解时区,还要了解用户的区域设置,以便您可以使用适合文化的格式。

    这与时区完全无关。例如,您可能是美国人,使用 MM/DD/YYYY 格式,但仍实际位于欧洲并使用欧洲时区。

  • 如果您的服务器通过API(即JSON,XML等)提供结果,那么您的结果应该是机器可读的。最好使用 ISO 8601 格式。具体而言,应按照 RFC 3339 中所述传递时间戳。

    这意味着它们应始终包含 a(对于 UTC 值)或偏移量(对于本地值)。因此,您可以考虑用户的时区,但您提供的结果应包括本地偏移量,以便明确无误。Z

    例如,您有 UTC 值 ,然后在其中,这就是应该通过 API 交付的内容。2014-07-09T12:00:00ZAmerica/Los_Angeles2014-07-09T05:00:00-07:00

    在客户端,您可以使用像 moment.js 这样的库为用户呈现该值。例如:

         var s = moment.parseZone("2014-07-09T05:00:00-07:00").format("LLL");
    

相关:如何正确使用时区?


答案 2

推荐