我正在使用服务器发送的事件,并尝试根据查看者的本地时间显示时间。
我的数据库中的所有时间均以 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()
位于远程调用的文件中时,这一切都会崩溃:
JavaScript
代码块 3
var src = new EventSource('sse_bot.php?uid=' + userID);
其中 date_default_timezone_get()
位于 sse_bot.php
文件中。
我尝试从浏览器窗口设置 session 变量:
代码块 4
$utimezone = date_default_timezone_get();
$_SESSION['tzone'] = $utimezone;
然后在 sse_bot.php
文件中使用它:
代码块 5
$utimezone = $_SESSION['tzone'];
但是没有骰子。
有什么想法吗?
编辑 1
我回显了它,并且 $utimezone = $_SESSION['tzone'];
确实将其设置为适当的值(在我的例子中为“美国/丹佛” )。但问题似乎出在这一行:
代码块 6
$date->setTimezone(new DateTimeZone($utimezone));
当我通过浏览器使用代码块2时,它工作得很好。我什至可以将该行更改为:
代码块 7
$date->setTimezone(new DateTimeZone('America/Denver'));
一切都很好。
对 sse_bot.php
文件进行相同的更改没有效果。经过所有的轻微操作后,返回的时间与进入的时间相同。
最佳答案
我认为你没有捕获重点。所有 PHP 都在服务器上运行,因此将始终反射(reflect)服务器的时区版本 - 这是每种情况下的预期行为。如果您想找到客户端的时区,那么您需要在 Javascript 中查询并将报告的值发送回服务器。
关于javascript - PHP,服务器发送事件 - date_default_timezone_get() 在远程文件中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38176836/