Php 我应该如何在服务器端存储来自JS的时间戳,以便可靠地转换为其他时区?

Php 我应该如何在服务器端存储来自JS的时间戳,以便可靠地转换为其他时区?,php,javascript,timezone,timestamp,Php,Javascript,Timezone,Timestamp,我有一个网站,在那里我为居住在美国西部的水疗中心预约,例如太平洋标准时间 当用户选择一个地点,例如2010年3月20日上午10:00时,从我的桌面上使用EDT时间的客户端创建的日期对象是: 时间戳:1395324000000 utc字符串:2014年3月20日星期四10:00:00 GMT-0400(美国东部时间) 我需要将其存储在服务器端。目前,我通过XHR将时间戳从JS传递到PHP,并除以1000: ajax url:ajax.php?时间戳=1395324000000 php代码: $ti

我有一个网站,在那里我为居住在美国西部的水疗中心预约,例如太平洋标准时间

当用户选择一个地点,例如2010年3月20日上午10:00时,从我的桌面上使用EDT时间的客户端创建的日期对象是:

时间戳:1395324000000
utc字符串:2014年3月20日星期四10:00:00 GMT-0400(美国东部时间)

我需要将其存储在服务器端。目前,我通过XHR将时间戳从JS传递到PHP,并除以1000:

ajax url:ajax.php?时间戳=1395324000000
php代码:

$time = $_GET['timestamp'] / 1000;
由于我的默认时区手动设置为
美国/纽约
,并且我的客户端时间为EDT,因此它们是一致的,因此显示正确的时间:

echo date('M d Y H:i:s', $time); // Mar 20 2014 10:00:00
但理想情况下,我想我真的应该将服务器端的日期时间设置为America/Los_Angeles。。但是,这会使
回送日期显示错误的日期,因为它将是
PST
,而不再是
EDT

date_default_timezone_set('America/Los_Angeles');
Mar 20 2014 07:00:00
现在,当用户最初选择上午10:00时,它已经变成了上午7:00,这显然会导致混乱。。。如果用户选择上午10:00,我需要它是上午10:00

我的另一个担忧是,如果用户的客户端时间不是EDT怎么办?它与
美国/纽约
美国/洛杉矶
不一致吗

我是否应该通过Javascript中的
.toutString
保存UTC字符串,然后以UTC存储时间,并将默认时区设置为UTC,然后在需要显示PST时间时将其转换为PST时间


顺便说一句,我不能使用
DateTimeZone
DateTime
,因为我正在处理php<5.3

我已经完成了这个约会。这让人困惑

我的解决方案是(按照您的建议)将所有内容存储为UTC,并在需要时将其转换为用户的时区

我用date.JS完成了主要的JS编码:

将服务器上的UTC日期转换为用户的本地日期

var d = new Date();
var offset = d.getTimezoneOffset();
var hours =  parseInt(offset / -60);
var minutes = (offset % 60) * -1;

appointment_date = Date.parse(utc_date).add({minutes: minutes, hours:hours})
当然,utc_日期必须采用正确的格式,但是使用日期格式mysql函数应该很容易

我总是将UTC日期和该日期的用户版本存储在数据库中-因此,当我向他们发送电子邮件时,我不必根据他们的TZ进行计算

appointment_id   utc_date           user_date
1                2011-10-01 10:00   2011-10-01 16:00
我相信你明白了


希望这有帮助。

您应该始终将时间戳存储在服务器上。您唯一需要关心时区的时间是,通过首先调用date_default_timezone_设置的输入日期(或将要输出的日期)在字符串中输入或输出日期时

如果需要在服务器上创建时间字符串(或解析),则需要找到客户端时区偏移量并相应地进行调整

如果在客户端上使用JS显示时间,则时间将自动显示/输入到本地时区。无法告诉浏览器使用不同的时区。您只能使用本地时区(默认)或调用
getutcxxx
方法获取GMT时间并自行调整(如果您知道要在其中显示的时区偏移量)。时间戳总是相同的,不管是哪个时区


真正的问题是当你需要夏令时。对于另一个问题来说,这是一个大问题。

请记住,此建议仅通过Microsoft web服务和生成的代理进行了测试,可能不适用于其他安排

我发现datetime值是由JS在浏览器时区中解释的

在下面的示例中,boundsResult是web方法调用的成功处理程序接收的数据集。开始和结束是将服务器保留为UTC的日期时间值

var offset_milliseconds = boundsResult[0].START.getTimezoneOffset() * 60000;
var startTime = new Date(boundsResult[0].START.getTime() - offset_milliseconds);
var endTime = new Date(boundsResult[0].END.getTime() - offset_milliseconds);
此修复取决于始终将服务器保留为UTC的值。这并非不合理的期望;通用时间表是处理多个客户端时区的唯一直接方法。存储本地化的值会带来麻烦

无论出于何种原因,以另一种方式转换似乎是自动的

你可以这样包装它:

function utcDate(date) {
  return new Date(date.getTime() - 60000 * date.getTimezoneOffset());
}
然后样本会像这样

var startTime = utcDate(boundsResult[0].START);
var endTime = utcDate(boundsResult[0].END);

据我所知,相同的时间戳(如果正确确定)表示任何时区中相同的时间“瞬间”。如果需要知道用户输入来自哪个时区,则只需存储时区。如果使用了,则无需担心,因为它已经是UTC时间戳。这只是一个服务器端的表示。好吧,但是服务器端的正确时区默认值是多少,然后按照顺序,它与用户选择的一致?将其设置为UTC,然后将其转换为PST?我相信您可能还需要传递stringy JS Date属性。您需要单独捕获
EDT
值以了解用户的时区,因为时间戳与区域无关。