【问题标题】:How to find correct timezone in JavaScript even if system settings are incorrect?即使系统设置不正确,如何在 JavaScript 中找到正确的时区?
【发布时间】:2018-08-31 18:38:02
【问题描述】:

我正在构建一个时间敏感的 Web 应用程序,用户在其中输入本地时间的时间相关数据,并以 UTC 格式保存在数据库中。到目前为止,该应用程序使用浏览器提供的时区(我假设它使用操作系统提供的时区)。系统时区是机主手动设置时出现的问题,可能是错误的。一个潜在的解决方案是从互联网上获取正确的时区。但我宁愿不要在某处调用 API,只是为了在每次需要时确定正确的时区设置(除非没有其他选项)。任何人都可以提出解决此问题的正确方法吗?

【问题讨论】:

  • 您最终无法判断什么对客户来说应该是“正确的”,因为您认为您对客户的了解来自客户。让他们使用他们想要的任何时区。
  • 就像Pointy说的:没有“二次猜测系统配置”的API。
  • @charlietfl 这可能会更好,但当然客户的时钟可能会意外或故意严重失控。
  • @charlietfl - 是的,一般来说,主机之间应该使用 UTC。但是,如果用户“错误地”设置了他的时区……那么 UTC 时间也可能会偏离那个量。这是个好主意 - 但它并不能解决这个特殊问题。
  • 你的服务器当然知道 HTTP 请求到达的时间。

标签: javascript timezone


【解决方案1】:

我不知道您要捕获什么时间,但是如果用户将在您的应用上执行的操作是在 0 处启动 JS 计时器,那么您将存储从零开始的偏移量,而不是固定时间戳,然后提交全部到您的应用程序(以及捕获的总秒数)。

从那时起,您可以将服务器时间的偏移量逆向工程到发生事情时的锻炼时间,并使用客户端的本地时区设置将其转换到正确的时区。

例如,如果他们在 1 秒、60 秒和 120 秒时执行操作,并且在您的应用上的总时间为 200 秒,您可以执行以下操作:

first action is current_timestamp - 200s + 1s
second action is current_timestamp - 200s + 60s
third action is current_timestamp - 200s + 120s

这将为您提供正确的时间戳,以便您随意更换时区。

【讨论】:

  • 另外值得注意的是,来自客户端的数据应始终被视为他们编造的,因此请添加合理的检查以确保您不会完全信任正在发生的事情。 IE。如果某些东西运行了“10 年”,但您的应用只运行了 24 小时,那就太可疑了。
  • 这对确定时区有何帮助?时区与偏移量不同。请参阅the timezone tag wiki中的“时区!= 偏移量”
  • @MattJohnson 我想您可能误解了我在这里使用偏移量的方式,偏移量与时区无关,它们是为了让您可以在绝对时间点针对 UNIX 时间戳放置操作.只有在您完成此操作后,您才能查找本地时区代码并将 unix 时间戳转换为本地时间。 stackoverflow.com/questions/23062515/…
  • 好的,但这不是最初的问题。
  • @MattJohnson 我不同意,如果您阅读了整个问题,您会看到它以“任何人都可以提出解决此问题的正确方法吗?”结尾。这不仅限于 JS,如果问题是“我只想使用 JS”,那么答案就是“你无法可靠地实现这一点”。
猜你喜欢
  • 2013-01-31
  • 2023-04-03
  • 2019-04-26
  • 2017-06-04
  • 2020-10-17
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
相关资源
最近更新 更多