我希望能够猜测用户的时区偏移量以及是否应用了夏令时。目前,我发现的最明确的代码是:
http://www.michaelapproved.com/articles/daylight-saving-time-dst-detect/
所以这给了我与DST指标的偏移量。
现在,我想在我的PHP脚本中使用这些来为用户输出本地日期/时间....但是最好的是什么?我想我有两个选择:
a)从timezone_abbreviations_list()的输出中选择一个具有相同偏移量和DST设置的随机时区。然后用这个调用date_timezone_set(),以便将正确的处理应用到时间。
b)继续将日期视为UTC,但只需添加一些时间戳,即可添加适当的小时数。
我的感觉是选项B是最好的方式。这样做的原因是,使用A,我可以使用一个时区虽然在偏移量/ dst方面是正确的,但可能会在场景后面有一些阻碍规则,这可能会产生令人惊讶的结果(尽管如此,我还不知道我认为我不能排除它。)
然后我会在每个会话开始时使用Javascript重新检查时区,以捕获用户的时区更改(非常不可能)或者传入DST时段。
对于大脑转储感到抱歉 - 我真的只是在确认上述方法是有效的。
谢谢,
詹姆斯。
答案 0 :(得分:7)
使用javascript稳健地确定用户的时区。查看jsTimezoneDetect。
它将为您提供一个Olsen时区数据库密钥,您可以将其用于服务器端日期时间计算。
答案 1 :(得分:3)
如果这是民意调查,那么“b”就是我的投票。
首先,所有时间都应以UTC格式存储。这是教条。这是一个非常明智的教条,在你的项目变得更加复杂之后,你最终会说“我当然希望我遵循这一点”。除此之外,它是唯一能够及时存储所有时间点的明确,一致的方式。任何具有夏令时的时区在开关周围都有模糊的时间参考(例如,凌晨1:30通常会发生两次)。此外,在时区之间进行转换时,大多数情况下您最终都会使用UTC作为中介。
其次,您必须决定您的网站是否为国际网站。如果没有,那么您为六个美国时区制定规则并结束它。有三个浏览器以自己的方式报告时间戳,这仍然只有18个案例,应该可以处理它们。除此之外的任何事情,你应该假设它需要一个高级学位来预测夏令时差异。时间在不同的地方转换。
b的最大问题是,如果这是一个类似日历的应用程序,如果您无法准确确定某人所在的时区,则调度仍然是一个问题。例如,假设它是二月份。 DST上没有人。有人会在5月5日下午6点(本地)安排一些事情。你会看到偏移量是UTC-4。你怎么知道那个人是否在新不伦瑞克省观察DST(在这种情况下意味着的时间是2100 UTC),或波多黎各没有(在这种情况下时间意味着是2200 UTC?这是一个棘手的问题。This post可能有一些帮助。
答案 2 :(得分:1)
如果您想依赖javascript,您只需来回发送utc时间/时间戳,让客户将其转换为本地时间表示。
编辑:简单的自包含示例(使用jquery)
<html>
<head>
<title>...</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
function foo(){
$('.time').each( function() {
var t = $(this);
var d = new Date(Date.parse(t.text()));
t.text(d.toLocaleString());
});
}
</script>
</head>
<body>
<div class="time"><?php echo gmdate(DateTime::RFC1123); ?></div>
<button onclick="foo()">local time</button>
</body>
</html>
如果javascript不可用,用户仍会看到日期/时间,但它是UTC格式 edit2:还有一个javascript库(或者它甚至是一个jquery插件?)做了这样的事情加上一些漂亮的转换,比如“一小时前”,“上周”......就像那样。但我忘了这个名字:(
答案 3 :(得分:1)
我认为如果不知道确切的时区,总会有机会错过一些模糊的规则。
与大多数国际化问题一样,规则比您预期的更为模糊。
您可以将其与其他指标相结合,以提高预测质量;例如:
结合上述内容应该给出一个非常合理的估计。但是,100%的确定性无法实现。
答案 4 :(得分:1)
请参阅此替代方案: https://stackoverflow.com/a/12682439/1691517
检测90个时区,在测试平台上具有100%的准确度。