Laravel Carbon 時間を変えずにタイムゾーンを変更する方法 質問する

Laravel Carbon 時間を変えずにタイムゾーンを変更する方法 質問する

データベースに保存されている日時を「yyyy-mm-dd HH-mm-ss」に変換し、タイムゾーンを「America/Los_Angeles」に設定する回避策を探しています。

タイムゾーンを変更すると、Carbon は自動的に時刻から 7 時間を減算します。これは、UTC から PST に時刻を変更するときに発生することですが、DB 内の時刻は PST 時間に設定されています。たとえば、今日の時刻を午前 10 時にしたいのですが、タイムゾーンを変更すると、Carbon はそれを今日の午前 3 時に変換します。

タイムゾーンを PST に変更しても、時刻は午前 10 時のままにするにはどうすればよいでしょうか。API 呼び出しにはタイムゾーンが必要なので、これを理解する必要があります。

ベストアンサー1

shiftTimezone()の代わりに メソッドを使用しますsetTimezone()

既存の Carbon インスタンスを呼び出すとsetTimezone()、日付/時刻が新しいタイムゾーンに変更されます。例:

$datetime = Carbon::createFromFormat('Y-m-d H:i:s', '2020-09-15 23:45:00');
echo $datetime->toAtomString() . "\n";
// 2020-09-15T23:45:00+00:00

$datetime->setTimezone('America/Los_Angeles');
echo $datetime . "\n";
// 2020-09-15T16:45:00-07:00

ただし、代わりに を呼び出すと、shiftTimezone()時間を変更せずにタイムゾーンが設定されます。最初からもう一度試してみましょう。

$datetime = Carbon::createFromFormat('Y-m-d H:i:s', '2020-09-15 23:45:00');
echo $datetime->toAtomString() . "\n";
// 2020-09-15T23:45:00+00:00

$datetime->shiftTimezone('America/Los_Angeles');
echo $datetime->toAtomString() . "\n";
// 2020-09-15T23:45:00-07:00

もちろん、メソッドを連鎖させることもできます。

$datetime = Carbon::createFromFormat('Y-m-d H:i:s', '2020-09-15 23:45:00')
    ->shiftTimezone('America/Los_Angeles');
echo $datetime->toAtomString() . "\n";
// 2020-09-15T23:45:00-07:00

配列の一部としてタイムゾーンを渡すことで、タイムゾーンを「シフト」することもできますsettings

$datetime = Carbon::createFromFormat('Y-m-d H:i:s', '2020-09-15 23:45:00')
    ->settings(['timezone' => 'America/Los_Angeles']);
echo $datetime->toAtomString() . "\n";
// 2020-09-15T23:45:00-07:00

おすすめ記事