PHP日期时间操作-设置新时区并扣除24小时

PHP日期时间操作-设置新时区并扣除24小时,php,date,datetime,Php,Date,Datetime,我在PHP中使用datetime()语句时遇到了令人惊讶的困难。我试图实现的是读取当前服务器时间(位于GMT-5),根据该时间,根据时区计算用户特定的日期和时间,然后从用户当前时间中扣除24小时。伦敦和上海的用户请参见以下示例: $timezone = date_default_timezone_get(); echo "The current server timezone is: " . $timezone; echo "<hr>"; $server_datetime = n

我在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');
一旦我开始修改用户日期时间,脚本将只返回用户时区的当前日期和时间,而不返回其他内容


感谢您的帮助

作为一种最佳实践,您可以使用以下方法:

//Asia/Kolkata +5:30
date_default_timezone_set("Asia/Kolkata");//set time zone
$istTime= strtotime(date("d-m-Y h:i:s"));//get timestamp in seconds
echo date("d-m-Y h:i:s");//16-03-2017 09:44:52

//Europe/London +0:00
date_default_timezone_set("Europe/London");//set new time zone
$dayBeforeTime= strtotime(date("d-m-Y h:i:s",$istTime))-86400;//get timestamp in seconds and subtracting 1 day seconds
echo date("d-m-Y h:i:s",$dayBeforeTime);//15-03-2017 04:14:52
$serverDateTime = new DateTime();

$userTimezone = new DateTimeZone('Europe/London');

$userDateTime = $serverDateTime->setTimezone($userTimezone);

$dateInterval = new DateInterval('P1D');

echo $userDateTime->sub($dateInterval)->format('Y-m-d H:i:s');
但是如果你想直接从变量中减去,你可以使用这个:

$serverDateTime = new DateTime();

$userTimezone = new DateTimeZone('Europe/London');

$userDateTime = $serverDateTime->setTimezone($userTimezone)->sub(new DateInterval('P1D'))->format('Y-m-d H:i:s');

echo $userDateTime;

你到底想要什么?这是你想要的吗?假设你有GMT+5:30的时间,你想转换成另一个偏移计时并扣除24小时?@SahilGulati是的,正确。如果是2016年12月31日05:30 GMT-5,那么是2016年12月31日10:30 GMT-0(伦敦)。现在我想从伦敦时间中扣除24小时,返回我2016年12月30日10:30。这非常接近我需要的时间,但是:我可以将间隔从1天调整为24小时吗?间隔可能是动态的,取决于用户输入(24/48/72/96小时)?问题是,我必须回显用户当前时间和当前时间减去24小时,因此需要至少有2个变量……或者只使用Google;)
PT24H
非常感谢,伙计,工作完美!很乐意帮忙:)
$serverDateTime = new DateTime();

$userTimezone = new DateTimeZone('Europe/London');

$userDateTime = $serverDateTime->setTimezone($userTimezone)->sub(new DateInterval('P1D'))->format('Y-m-d H:i:s');

echo $userDateTime;