【发布时间】:2017-08-07 02:03:43
【问题描述】:
我在 PHP 中使用 datetime() 语句时遇到了令人惊讶的困难。我想要实现的是读取当前服务器时间(位于 GMT-5 中),根据该时间根据时区计算用户特定的日期和时间,然后从用户当前时间中减去 24 小时。请参阅下面的伦敦和上海用户示例:
$timezone = date_default_timezone_get();
echo "The current server timezone is: " . $timezone;
echo "<hr>";
$server_datetime = new \DateTime('now'); //located in America/New_York timezone - GMT-5
$server_newdate = (new \DateTime())->modify('-1 day');
echo "Current Server DateTime: " . $server_datetime->format('Y-m-d H:i:s') . "<br>";
echo "If you deduct 24 hours you get " . $server_newdate->format('Y-m-d H:i:s');
echo "<hr>";
$usersTimezone1 = 'Europe/London'; // GMT-0
$user_datetime1 = $server_datetime->setTimezone(new DateTimeZone($usersTimezone1));
$user_newdate1 = ($server_datetime->setTimezone(new DateTimeZone($usersTimezone1))->modify('-1 day'));
//$user_newdate1 = $user_datetime1->modify('-1 day');
echo "London User DateTime: " . $user_datetime1->format('Y-m-d H:i:s') . "<br>";
echo "If you deduct 24 hours you get " . $user_newdate1->format('Y-m-d H:i:s');
echo "<hr>";
$usersTimezone2 = 'Asia/Shanghai'; // GMT+8
$user_datetime2 = $server_datetime->setTimezone(new DateTimeZone($usersTimezone2));
$user_newdate2 = $user_datetime1->modify('-1 day');
echo "Shanghai User DateTime: " . $user_datetime2->format('Y-m-d H:i:s') . "<br>";
echo "If you deduct 24 hours you get " . $user_newdate2->format('Y-m-d H:i:s');
如您所见,问题是我无法直接从保存用户时区当前时间的 $user_datetime 变量中扣除 24 小时。直接从变量中扣除或为这个时区创建一个新的 datetime() 实例似乎都不能解决问题。
// attempt 1 - not working
$user_datetime1 = $server_datetime->setTimezone(new DateTimeZone($usersTimezone1));
$user_newdate1 = ($server_datetime->setTimezone(new DateTimeZone($usersTimezone1))->modify('-1 day'));
// attempt 2 - not working either
$user_datetime2 = $server_datetime->setTimezone(new DateTimeZone($usersTimezone2));
$user_newdate2 = $user_datetime1->modify('-1 day');
一旦我开始修改用户日期时间,脚本将只返回用户时区的当前日期和时间,没有其他内容。
感谢您的帮助
【问题讨论】:
-
您到底想要什么?这是你想要的吗,假设你有 GMT+5:30 时间你想转换成另一个偏移时间并减去 24 小时?
-
@SahilGulati 是的,正确的。如果假设它是 2016 年 12 月 31 日 05:30 GMT-5,那么它是 GMT-0(伦敦)的 2016 年 12 月 31 日 10:30。现在我想从伦敦时间减去 24 小时,返回 30/12/2016 10:30。