我正在使用服务器发送的事件,并尝试根据查看器的本地时间显示时间。
我的数据库中的所有时间都存储为GMT,位于DATETIME
字段中:
代码块
date_default_timezone_set('GMT');
$now = date('Y-m-d H:i:s');
$stmt = $db->prepare('INSERT INTO...');
$stmt->execute(array($now));
然后反过来(可能比它需要的更复杂):
代码块2
$utimezone = date_default_timezone_get();
$then = date($row['ndate']);
$date = date_create($then);
$date->setTimezone(new DateTimeZone($utimezone));
$nDate = date_format($date, 'd M \'y (g:i A)');
当窗口在浏览器中处于活动状态时,这一切都正常工作,但当date_default_timezone_get()
位于远程调用的文件中时会崩溃:
的JavaScript
代码块
var src = new EventSource('sse_bot.php?uid=' + userID);
其中date_default_timezone_get()
位于sse_bot.php
文件中。
我尝试从浏览器窗口设置会话变量:
代码块4
$utimezone = date_default_timezone_get();
$_SESSION['tzone'] = $utimezone;
然后在sse_bot.php
文件中使用它:
代码块
$utimezone = $_SESSION['tzone'];
但没有骰子。
有什么想法吗?
编辑1
我回复了它,$utimezone = $_SESSION['tzone'];
将其设置为适当的值(在我的情况下为'America / Denver')。但具体而言,问题似乎在于:
代码块6
$date->setTimezone(new DateTimeZone($utimezone));
当我通过浏览器使用 Code Block 2 时,它可以完美运行。我甚至可以将行改为:
代码块7
$date->setTimezone(new DateTimeZone('America/Denver'));
一切都很好。
对sse_bot.php
文件进行相同的更改无效。在所有轻微的手段之后返回的时间与进入它的时间相同。
答案 0 :(得分:0)
我想你错过了这一点。所有PHP都在服务器上运行,因此将始终反映服务器的时区版本 - 这是每种情况下的预期行为。如果要查找客户端的时区,则需要在Javascript中查询并将报告的值发送回服务器。
答案 1 :(得分:0)
问题在于时区已经是美国/丹佛',因为我没有设置它。在浏览器版本中,它在其他位置设置,但在sse_bot.php
中,它不是。
只需添加:
date_default_timezone_set('GMT');
在 Code Block 6 之前的某个地方,Bob是你的阿姨。
(可能不值得回答,更适合评论,但未来的傻瓜会更容易找到这个。)