2017-03-16 6 views
2

PHPのdatetime()ステートメントで驚くほど苦労しています。私が達成しようとしているのは、現在のサーバー時間(GMT-5に位置する)を読み取り、その時間に基づいてユーザーの特定の日時をタイムゾーンごとに計算し、ユーザーの現在の時間から24時間を差し引くことです。ロンドンと上海でのユーザーのために、以下の例を参照してください:あなたが見ることができるようにPHP DateTime操作 - 新しいタイムゾーンを設定して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'); 

ユーザーの日時の変更を開始すると、スクリプトはユーザーの現在の日付と時刻のみを返します。

$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'); 

をしかし、あなたは変数から直接引くしたい場合は、このいずれかを使用できます。ベストプラクティスの一種として助け

+0

正確に何を望みますか?これは欲しいですか?GMT + 5:30時間を別のオフセットタイミングに変換して24時間を控除したいとしますか? –

+0

@SahilGulatiはい、正しくありません。 GMT-5は31/12/2016 05:30 GMT-5、GMT-0(ロンドン)は10/31/2010 10:30と表示されます。ロンドンの時間から24時間を差し引いて、30/12/2016 10:30と返すようにしたい。 – Armitage2k

答えて

3

ため

おかげで、あなたはこれを使用することができます:

$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; 
+0

これは私が必要とするものにかなり近いですが、1日から24時間までの間隔を調整できますか?間隔は動的で、ユーザーの入力に依存します(24/48/72/96時間)。問題は、私は現在の時間と現在の時間から24時間を差し引いて、少なくとも2つの変数を持つ必要があるということです... – Armitage2k

+0

またはちょうどGoogleを使用します;) 'PT24H' – Armitage2k

+0

喜んで:) – JayIbe

1
//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 
関連する問題