【问题标题】:display date/time on website base on user computer time in different country根据不同国家/地区的用户计算机时间在网站上显示日期/时间
【发布时间】:2011-04-08 19:50:36
【问题描述】:

我正在开发一个网站应用程序的聊天信使。对于我的概念,我避免使用时区。

当用户发布消息时,我使用 php 获取我当前的服务器日期/时间并将其保存到数据库中。

要向用户显示所有消息的时间,我只需要找出服务器时间和用户系统时间之间的差异。假设不同的是 3 小时,我只需要使用 mysql 从数据库中检索记录的服务器时间,然后添加 3,例如:$message-time-display = $server-time-of-message-posted + $different。

对于此解决方案,虽然用户的计算机时间可能不正确,但不会影响保存在我的数据库中的时间记录。当用户更正计算机时间时,它将显示正确的时间。这个解决方案可靠吗?如果是这样,为什么没有人这样做?为什么这么多人使用 GMT 或时区?也许我错过了一些重要的问题?

【问题讨论】:

  • 由于第 2 步,您无法使用 PHP 执行此操作。PHP 无法知道用户计算机上的时间。你需要 Java 才能抓住它。
  • 感谢您告知我这件事。不用担心,我可以使用 javascript 来抓取它,然后通过 $local_time = "";将 javascript 变量传递给 php 变量>
  • 哼,那只会把字符串 "";在 var $local_time 中。要将数据发送回 PHP,您需要使用某种形式的 AJAX。
  • 是的,您需要使用 AJAX,PHP 会在 Java 运行在客户端机器上之前被解析并提供服务。
  • 我没有使用ajax,我使用jQuery.get("chktimedif.php?usertime="+usertime, function(data) { });将javascript变量传递给php,以便php可以使用mysql SELECT TIMEDIFF ('$usertime','$servertime')在服务器时间和客户端时间之间进行数学计算

标签: php mysql timezone


【解决方案1】:

一个快速解决方法是不显示确切时间,而是显示经过的时间。例如:2 分钟前

然后……

由于您知道经过的时间,您可以从用户的当前时间中减去该时间。 您可以使用 javascript 获取用户当前时间。

var d = new Date();
var curr_hour = d.getHours();
var curr_min = d.getMinutes();

【讨论】:

  • 对不起,我听不懂你的句子...为什么不显示确切的时间?
  • 经过深思熟虑,现在我明白你在说什么了。无论如何,这不是我们想要的,无论如何,谢谢。
【解决方案2】:

如果您正在编写一个只在一台服务器上的应用程序,那么可以将时间存储为您的本地服务器时间。如果您的应用程序将部署在全球许多地方,那么将所有时间存储为UTC 会更有意义。

在我看来,用户提供的时间应在存储之前从用户的时区转换为 UTC(或服务器的时区,如果它是您的个人应用程序),并且在显示时应转换回用户的时区。

所以在你的情况下,它应该是这样的:

  1. 用户操作 -> 将 UTC 时间存储在数据库中
  2. 另一个用户操作 -> 将当前 UTC 时间与存储的 UTC 时间进行比较并显示差异。

如果你显示时间戳,它应该是这样的:

  1. 用户操作 -> 将 UTC 时间存储在数据库中
  2. 用户访问 -> 检索存储的 UTC 时间并将其转换为用户的时区。展示。

【讨论】:

  • 为什么需要“翻译成用户的时区”?我虽然只需要显示 $result = $recorded_server_time + $different_between_local_and_server_time?
  • @zac1987:如果您要显示经过的时间,请使用第一个示例。如果您要显示操作完成的时间,请使用第二个示例。您不必在本地时间显示时间戳,但用户很欣赏它。
  • @dnagirl,经过的时间是什么意思? $elapsed_time = $server_time - $local_time?经过时间是服务器时间和本地时间之间的不同小时?我虽然可以通过显示 $result = $recorded_server_time + 或 - $elapsed_time 来显示操作完成的时间?
  • @zac1987: $elapsed = $now - $then; 不要混用你的服务器和用户时间系统。在一个系统中完成所有计算。 $elapsed= $usernow - $userthen; 或 $elapsed= $servernow - $serverthen; 任何一个表达式都会给出相同的答案,就像 6-2=4 和 12-8=4 一样。
  • @dnagirl,如果我使用你的概念,那么我需要将存储的服务器时间转换为用户的时区。对于我的概念,我避免时区转换,首先我找出服务器时间和用户系统时间之间的差异。假设不同是3小时,我在数据库中的“不同”字段中存储数字“3”。所以我的数据库有 2 个字段 - “server_time”和“不同”。所以虽然用户的系统时间不正确,但不会影响我的数据库记录。当我想显示当前消息和上一条消息的时间时,我...
【解决方案3】:

只要用户正确设置了时间,您的解决方案就应该有效。这实际上是唯一的问题。为什么你认为没有人这样做?我想他们中的大多数人都这样做,只有懒惰的人依赖 GMT/EST 时间。

提示:我看到在跟踪代码(例如 google 的分析 javascript)中发送的用户时间,可能是为了计算您所采取的差异;)

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多