使用 carbon 将 utc 更改为其他时区给出相同的结果

Tsu*_*una 10 php timezone php-carbon laravel-5

在我的数据库中,时间保存为 utc。

我正在尝试使用碳(不必是碳)并在将数据传递到前端时将其更改为其他时区,例如太平洋时区或美国/温哥华。我想让数据库保持 utc,这在未来会更灵活。

但不知何故,当我使用碳时,我得到了相同的结果

$tz = $tt->created_at;  // "2019-01-16 18:21:31"
$date = Carbon::createFromFormat('Y-m-d H:i:s', $tz, 'America/Vancouver');
dd($tz, $date);
Run Code Online (Sandbox Code Playgroud)

$date 给我结果

Carbon @1547691691 {#212
  date: 2019-01-16 18:21:31.0 America/Vancouver (-08:00)
}
Run Code Online (Sandbox Code Playgroud)

当我做 dd($tz, $date->toDateTimeString());

我得到

"2019-01-16 18:21:31"  // $tz
"2019-01-16 18:21:31"  // $date->toDateTimeString()
Run Code Online (Sandbox Code Playgroud)

不应该$date->toDateTimeString()"2019-01-16 10:21:31"因为时间是-08:00?

有人可以帮我看看我在这里做错了什么吗?

提前致谢。

M4H*_*YaR 21

当您使用createFromFormat要创建一个碳对象,你可以中读取文件2019年1月16日18时21分31秒 的DateTime美国/温哥华时区

但您真正想要做的是将您的 UTC 时间转换为美国/温哥华时间。

您应该使用 UTC 时区创建 DateTime

$tz = $tt->created_at;  // "2019-01-16 18:21:31" (UTC Time)
$date = Carbon::createFromFormat('Y-m-d H:i:s', $tz, 'UTC');
Run Code Online (Sandbox Code Playgroud)

因此,您的 DateTime 对象与您的数据库一样采用UTC格式,然后将其转换为美国/温哥华时间

$date->setTimezone('America/Vancouver'); // "2019-01-16 10:21:31" (America/Vancouver Time)
Run Code Online (Sandbox Code Playgroud)