[英]How should I store a timestamp coming from JS on the server-side in a way that I can reliably use to convert to other timezones?
我有一个网站,我在那里设置了一个位于美国西部的水疗中心的预约,例如PST时间。
当用户在2010年3月20日上午10:00选择一个地点时,在桌面上使用EDT时间从客户端创建的日期对象是:
时间戳:1395324000000
utc string:2014年3月20日星期四10:00:00 GMT-0400(美国东部时间)
我需要将它存储在服务器端。 目前,我通过XHR将时间戳从JS传递给PHP并除以1000:
ajax url:ajax.php?timestamp = 1395324000000
php代码:
$time = $_GET['timestamp'] / 1000;
由于我的默认时区是手动设置为America/New_York
,而我的客户端时间是在EDT中,因此它们是一致的,因此会显示正确的时间:
echo date('M d Y H:i:s', $time); // Mar 20 2014 10:00:00
但理想情况下我认为我应该将服务器端日期时间设置为America / Los_Angeles ..但是这会使echo date
显示错误的日期,因为它将是PST
而不是EDT
:
date_default_timezone_set('America/Los_Angeles');
Mar 20 2014 07:00:00
它现在变成早上7点,当用户最初选择上午10点时,这显然会引起混淆......如果用户选择上午10点,我需要它是上午10点。
我的另一个担心是,如果用户的客户端时间不是EDT怎么办? 它会与America/New_York
或America/Los_Angeles
不一致吗?
我应该做一些事情,比如在Javascript中通过.toUTCString
保存UTC字符串,然后以UTC格式存储时间,并将默认时区设置为UTC,然后在需要显示PST时间时将其转换为PST时间?
顺便说一句 ,我不能使用DateTimeZone
或DateTime
因为我正在处理php <5.3
我做过这个约会的事情。 这让人很困惑。
我的解决方案是(如您所建议的)将所有内容存储为UTC,并在需要时将其转换为用户的时区。
我用date.js做了主要的JS编码: http ://www.datejs.com/。
将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_date必须采用正确的格式 - 但使用date_format mysql函数应该很容易。
我总是将UTC日期和该日期的用户版本存储在数据库中 - 所以当我给他们发电子邮件时,我不需要根据他们的TZ进行计算
appointment_id utc_date user_date
1 2011-10-01 10:00 2011-10-01 16:00
我相信你明白了。
希望这可以帮助。
请记住,此建议仅通过Microsoft Web服务和生成的代理进行了测试,可能不适用于其他安排。
我发现JS在浏览器时区中解释了datetime值。
在以下示例中,boundsResult是Web方法调用的成功处理程序接收的数据集。 START和END是将服务器保留为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);
您应始终将时间戳存储在服务器上。 您需要关心时区的唯一时间是通过首先调用date_default_timezone_set和输入日期的时区(或将要输出)来输入或输出字符串中的日期
如果需要在服务器上创建时间字符串(或解析),则需要找到客户端时区偏移量并相应地进行调整。
如果您在客户端上使用JS显示时间,则将在本地时区自动显示/输入时间。 没有办法告诉浏览器使用不同的时区。 您只能使用本地时区(默认)或调用getUTCxxxx
方法来获取GMT时间并getUTCxxxx
调整(如果您知道要显示的时区偏移)。 无论什么时区,时间戳始终相同。
真正的问题是你需要考虑夏令时。 对于另一个问题,这是一个很大的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.