我正在使用服务器发送的事件,并尝试根据查看器的本地时间显示时间。
我的数据库中的所有时间都存储为GMT,在DATETIME
字段中:
代码块1
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()
在远程调用的文件中时就会崩溃:
代码块3
var src = new EventSource('sse_bot.php?uid=' + userID);
sse_bot.php
文件中date_default_timezone_get()
所在的位置
我尝试从浏览器窗口设置会话变量:
代码块4
$utimezone = date_default_timezone_get();
$_SESSION['tzone'] = $utimezone;
,然后在sse_bot.php
文件中使用它:
代码块5
$utimezone = $_SESSION['tzone'];
但是没有骰子。
任何想法吗?
编辑1
我回应了它,并且$utimezone = $_SESSION['tzone'];
确实将其设置为适当的值(在我的情况下为'America/Denver')。但问题似乎是,特别是与行:
代码块6
$date->setTimezone(new DateTimeZone($utimezone));
当我通过浏览器使用代码块2时,它工作得很好。我甚至可以把这行改成:
代码块7
$date->setTimezone(new DateTimeZone('America/Denver'));
一切都好。
对sse_bot.php
文件进行相同的更改没有效果。返回的时间与输入的时间相同。
我认为你没有抓住重点。所有PHP都在服务器上运行,因此总是反映服务器的时区版本——这是在每种情况下的预期行为。如果你想找到客户端的时区,那么你需要在Javascript中查询并将报告的值发送回服务器。
问题是时区已经是'America/Denver'了,因为我没有设置它。在浏览器版本中,它是在其他地方设置的,但在sse_bot.php
中,它不是。
只需添加:
date_default_timezone_set('GMT');
在代码块6之前的某处,Bob是你的阿姨。
(可能不值得回答,更适合作为评论,但未来的人会更容易找到这个)