Laravel Carbon 如何在不更改小时的情况下更改时区

2022-08-30 12:13:13

我正在尝试找到一种解决方法,如何将存储在数据库中的日期时间转换为“y-mm-dd HH-mm-ss”,并为其提供时区“America/Los_Angeles”。

如果我更改时区,Carbon 将自动从时间中减去 7 小时,这是将时间从 UTC 更改为 PST 时发生的情况,但我的数据库中的时间设置为 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

答案 2

我认为你正在寻找的是这个:

Carbon::createFromFormat('Y-m-d H:i:s', $some_date, 'UTC')
    ->setTimezone('America/Los_Angeles')

首先,设置最初具有的时区,因此,如果将日期存储在数据库中的 UTC,然后将默认时区设置为 UTC,则 用于从 v 拥有的时区更改为新时区。->setTimeZone('Valid/Timezone')


推荐