繁体   English   中英

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

[英]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_YorkAmerica/Los_Angeles不一致吗?

我应该做一些事情,比如在Javascript中通过.toUTCString保存UTC字符串,然后以UTC格式存储时间,并将默认时区设置为UTC,然后在需要显示PST时间时将其转换为PST时间?

顺便说一句 ,我不能使用DateTimeZoneDateTime因为我正在处理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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM