【问题标题】:JavaScript - How can i get the correct time of PHP server?JavaScript - 如何获取 PHP 服务器的正确时间?
【发布时间】:2016-04-14 19:06:00
【问题描述】:

我需要显示 PHP SERVER DATE 的中心计时器,这里是 date1。 (它是关于在比利时时间设置的会议和来自不同国家的其他人加入会议以实时查看会议持续时间。)

date1 变量值来自位于比利时的 PHP 服务器。 但是用户在美国,米德尔东部,亚洲,澳大利亚,并且浏览器日期与PHP服务器日期不同。

如何在不作为比利时日期/时间爬取到服务器的情况下获取 date2 值?这样我就可以在 date2 上实时显示差距。

var date1 = new Date("10-01-2016 09:00:00"); // Meeting at PHP SERVER date 
var date2 = new Date("10-01-2016 09:30:32"); // User joined remotely but Browser date is wrong here

var diff = date2.getTime() - date1.getTime();
var msec = diff;
var hh = Math.floor(msec / 1000 / 60 / 60);
msec -= hh * 1000 * 60 * 60;
var mm = Math.floor(msec / 1000 / 60);
msec -= mm * 1000 * 60;
var ss = Math.floor(msec / 1000);
msec -= ss * 1000;

alert(hh + ":" + mm + ":" + ss);

【问题讨论】:

  • 通常最简单的方法是让所有 DB/PHP/Server 端服务器使用相同的时区,例如 UTC。然后,如果您需要本地化时间/日期,请为每个用户执行此操作。
  • 在服务器端仅设置为比利时时区。所以 date1 的值是在用户首次登录时从服务器获取的。但问题是我现在如何告诉 date2 他必须显示比利时的时间(不是从服务器抓取,而是从本地抓取)
  • 您是否希望所有用户看到会议已经进行了多长时间,或者距离会议开始/停止还有多长时间,而不实际显示绝对时间?是这个问题吗?如果你能给出一个更详细的例子,以及浏览器中的输出应该是什么,那就太好了。
  • 是的 - 我需要向美国、亚洲、中东用户(所有)显示会议进行了多长时间。所以每个人都知道会议是在上午 9 点,但它持续了 2 小时 00:02:03,就像这样。

标签: javascript php google-chrome datetime opera


【解决方案1】:

我认为您可以使用这个答案:Getting the client's timezone in JavaScript 来获取客户端(浏览器)时区偏移量,php 服务器可以将此信息与 date1 一起发送,并且从这里很容易像您已经做的那样进行转换。

另一种方法可能是服务器还发送当前时间(类似于 Date http 标头的内容),客户端可以将客户端在获取 http 时的时间保存在变量中,然后计算服务器时钟和客户端时钟之间的差异。这样它不仅可以计算比利时的 9AM 和纽约的 2AM,还可以在客户端显示一个与服务器时间同步的计数器(这意味着即使客户端的时钟关闭了 2 分钟,计数器也可以是准确到服务器的时钟,因此所有人都会看到相同的计数器,无论他们的客户端时钟是否不准确(即使我们不考虑不同的时区,这也是一个不错的功能)

所以在你的 php 中除了 date1="10-01-2016 09:00:00" 你还会发送

server_date="<?php date('...') ?>"

使用http://php.net/manual/en/function.date.php 作为格式字符串:)

然后在 onLoad 回调一开始的 JavaScript 中你会这样做:

client_date = new Date();

现在您可以进行算术运算了(在伪代码中):

elapsed_since_start = date1 + (server_date - client_date)

当然,如果您需要考虑不同的时区,那么您也需要考虑到这一点:

elapsed_since_start = (date1-server_tz_offset) + ((server_date-server_tz_offset) - (client_date-client_tz_offset))

【讨论】:

  • 第二种方法不起作用。因为有些用户会因为交通拥堵等原因延迟加入会议。我们需要显示如果他迟到了,那就是他迟到了 10 分钟。会议已经开始。
  • 它会起作用,为什么不呢?假设由于交通原因我“实际上”迟到了 10 分钟,而我的笔记本电脑的时钟与服务器的时钟相比晚了 3 分钟。问题是你想看到我迟到了 10 分钟还是 13 分钟。
  • 我想看到迟到 10 分钟(实际迟到基于服务器时间戳)。
  • 好的,这就是为什么你需要我的第二种方法来计算服务器和客户端时钟之间的差异。如果您只使用第一种方法,那么它会显示 7 分钟,因为它会认为时间是 09:07,尽管“真实”的 ot 服务器时间已经是 09:10。
  • 可以举个例子吗?导致它混淆你的最后一个陈述正是我需要实现的。
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多