Laravel + Carbon + 时区

5
我已经在config/app.php中配置了时区为Europe/Lisbon
如果我执行return date_default_timezone_get();,它会像我想要的那样返回Europe/Lisbon
到目前为止一切都很好!
当我使用Carbon::now()时,它返回例如16点而当前时间是17点。有人能解释一下为什么没有考虑夏令时吗?
我使用的是Laravel 7.16、PHP 7.4
问候
编辑1:代码图像+时间| https://imgur.com/pfh6uij 编辑2:每次更改配置时总是php artisan optimize:clear 来清除所有缓存。
编辑3:模型上的created_atupdated_at获取正确的时间。

编辑4: return Carbon::now() 返回错误的小时数。使用 dd(Carbon::now()) 可以返回正确的值,时区在 config/app.php 中配置 | dd() 示例 -> date: 2020-07-08 17:25:28.935949 Europe/Lisbon (+01:00)

编辑5: 在github上提出了一个问题 - https://github.com/laravel/framework/issues/33475

编辑6: 在我的情况下,我使用php date()函数来解决这个问题。虽然不是我想要的方式,但它能够完成工作...

if (date(now()) > $subscriber->token_expire_date)
{
    // return not found response
    return $this->response(false, 410, 'The token has expired.', []);
}

1
Carbon是基于UTC的,因此仅使用Carbon::now()将以UTC格式输出时间。您必须指定时区才能准确反映您所在城市或地区的日期和时间。例如,Carbon::now('America/Montreal')可以使用Carbon::now('PST')Carbon::now('Continent/City') - STA
1
你在 return Carbon::now()dd(Carbon::now()) 中得到的结果一样吗? - STA
1
@Kurt 看起来这是新版本的一个故障,这里还有一个相同的问题 https://stackoverflow.com/questions/62758417/laravel-7-carbon-return-ever-time-as-utc/62758619?noredirect=1#comment110984137_62758619 - STA
2
这是一个非常奇怪的问题。希望有人能够解决它。在这里值得一些大赞。 - Kurt Friars
1
你可以使用date()函数来获取正确的时间。通过调用date_default_timezone_set('Europe/Lisbon')函数设置时区为欧洲里斯本,然后使用echo date("YmdHis")输出当前时间。更多信息请查看https://www.php.net/manual/en/function.date.php。 - bhucho
显示剩余8条评论
1个回答

6

Carbon使用默认的DateTime PHP对象,因此使用date_default_timezone_set()函数来设置时区,例如:date_default_timezone_set('Europe/Lisbon');

或者你可以在AppServiceProvider中定义它 App/Providers/AppServiceProvider.php

public function boot()
{
    date_default_timezone_set('Europe/Lisbon');
}

或者您可以使用carbon方法的setTimezone

echo Carbon::now()->setTimezone('Europe/Lisbon')->format('H:i');

谢谢,但没有起作用。我正在测试美国时区,希望能得到不同的值,但却没有。 - hhelderneves
这适用于我的先前版本5.x,但不适用于Laravel 7.x。我认为在Laravel 7上有一个小故障。对于6.x没有想法。 - STA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接