2

假设我有一个执行此操作的 PHP 脚本:

$timeNow = 1349852400000; // Unix time for Oct 10, 2012 00:00:00 PDT
echo "<script type='text/javascript'>";
echo     "setTimeout(function(){alert('time out!');}, $timeNow - Date.now());";
echo "</script>";

如果将此脚本提供给日期/时间设置为 2013 年的设备会怎样。会发生什么?如果将其提供给日期/时间设置为 2010 年的设备怎么办?

服务器时钟设置的时间和日期是否重要?这对 2013 年的设备有何影响?那个卡在2010年的呢?

如果我想为此选择一个值$timeNow,则将在 2012 年 10 月 10 日 00:00:00 同步到加利福尼亚州旧金山(即设置为太平洋时间的设备和设置为中央时间应该在同一时刻显示警报,即使中央时间设备是凌晨 2:00:00),我可以这样做吗?我不是必须为 Pacific 设备提供一个值,而为 Central 设备提供一个不同的值来说明与 UTC 的时区差异吗?

抱歉,时区对我来说真的很混乱。我很难绕过他们。

4

2 回答 2

1

如果为此使用 Unix 时间,则无需担心(下面有一个例外)。无论时区如何,听起来您都希望警报在完全相同的时刻在世界各地弹出。

Unix 时间 0 是

  • 1970 年 1 月 1 日午夜,祖鲁时间
  • 旧金山时间 1969 年 12 月 31 日下午 4 点

因此,如果您安排在时间 0 发出警报,旧金山和伦敦的人们会同时看到警报。任何 Unix 时间也是如此,这实际上只是一个描述时间瞬间的数字。世界各地的同一瞬间。所以以下两个日期时间字符串

  • 1970-01-01T00:00:00Z
  • 1969-12-31T16:00:00-0800

是同一时刻的表示,用 Unix 时间 0 表示。

同样,世界上的每个人都在完全相同的时刻看到时间 1349852400000,无论他们的时区如何。因此,由于您的代码试图在 Unix 时间描述的给定时刻发出警报,因此您的代码原则上应该可以工作,前提是运行脚本的计算机设置为正确的 time

我想如果您真的想让一堆计算机同时发出警报(您是在编写病毒吗?开玩笑)并且您想处理设备可能设置不正确的时钟的情况,您可以让它们制作调用中央时间服务器并根据它设置超时。然后您可能必须处理跨站点问题,但原则上,如果所有机器都同意与中央时间服务器通信并接受来自中央时间服务器的数据,您可以这样做。

附录

这是可能的工作方式。假设您的脚本在一堆机器上运行。他们的时钟都设置错了。也许他们故意把时钟弄错了;也许他们不小心把时钟弄错了。但你希望他们都同时发出警报。

因此,您的脚本应该做的是:对您的服务器进行 (Ajax) 调用——与交付嵌入脚本的 HTML 页面相同的服务器,以简化跨站点问题。此调用与您的服务器对话,该服务器知道实时时间。现在您还知道从现在到警报时间的时间。因此,在您的服务器上减去这两个值并将该数字返回给客户端。然后客户做

setTimeout(theAlertFunction, theValueReturnedFromTheAjaxCall)

你很高兴。

于 2012-10-05T07:15:13.553 回答
0

如果用户的系统设置为错误的日期,则您无能为力,如果您忽略这种情况,您可以在任何系统中获得服务器时间戳的正确时间。

您可以在任何时区与 UTC 进行时间偏移并将其添加到您的时间戳 Bingo 中!

 var d = new Date(); 
    var yourCorrectDate = new Date(timeNow +(d.getTimezoneOffset() * 60000)); 
// timenow is the time your server has sent

分分钟给你抵消

d.getTimezoneOffset() 
于 2012-10-05T07:10:12.850 回答