web-dev-qa-db-ja.com

タイムゾーンに基づくカーボンの2回の秒単位の差

異なるタイムゾーンでの2回の違いを知りたいです。私のサーバーはシドニーに基づいており、指定された時間と現在の時間(パースに基づく)の差を秒単位で見つけたい

_    echo $tz = Carbon::now('Australia/Perth');
    echo "<br>";
    $local='2017-04-11 12:39:50';
    echo $emitted = Carbon::parse($local);
    echo "<br>";
    echo "diff from carbon->";
    echo $diff = $tz->diffInSeconds($emitted); 
    echo "<br> diff from Normal->";
    echo  $diff1 = strtotime($tz) - strtotime($emitted);
_

diffInSecondsを使用すると、2時間の差があり、ローカリゼーションは考慮されていないように見えますが、strtotime($tz) - strtotime($emitted)は完璧な結果をもたらします。私が逃したことはありますか?

5
sumit

解析する文字列に使用するタイムゾーンをCarbonに指示する必要があります。 strtotime関数は、解析された文字列がdefault_timezone_get()のタイムゾーンを使用していると常に見なすため、適切な選択ではないと思います。

例えば:

    echo $now = Carbon::now('Australia/Perth');
    echo "<br>";
    echo $emitted = Carbon::parse($now, 'Australia/Sydney');
    echo "<br>";
    echo "diff from carbon->";
    echo $diff = $now->diffInSeconds($emitted);
    echo "<br> diff from Normal->";
    echo  $diff1 = strtotime($now) - strtotime($emitted);

結果は次のようになります:

diff from carbon->7200
diff from Normal->0

$ emittedは「Australia/Sydney」を使用し、$ nowは「Australia/Perth」を使用することになっているため、通常の差分は明らかに間違っています。ただし、2つの変数の文字列表現はまったく同じであるため、差分は0です(異なるタイムゾーンに関する情報は失われます)。

ただし、Carbonとの差分は、オーストラリア/シドニーとオーストラリア/パースの実際の違いである7200秒(= 2時間)の正しい違いを示しています。

デフォルトでは、すべての日付および日時関数(Carbonを含む)は、config/app.phpファイルのtimezone変数の値を使用しています。

9
shock_gone_wild