データベースに保存されている日時を「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