我刚刚开始使用Carbon扩展(到目前为止似乎很甜蜜),但对Carbon::now()
函数感到困惑。根据文档,似乎此功能应该反映用户当前时区的当前时间,但是,我似乎得到的时间比格林威治标准时间早一个小时。
即 Carbon::now()
说2015-01-01 17:26:46
当我在PST上时,它实际上是2015-01-01 08:26:46
的。
我是否必须检测并输入所有实例的用户本地时区?
什么给?(我很可能对网站如何获得用户本地时间有根本性的误解)
Carbon是基于UTC的,因此只需执行Carbon::now()
就会以UTC格式输出时间
您必须指定时区才能准确反映您所在城市或地区的日期时间。
有两种方法可以做到这一点。您可以执行以下操作之一:
Carbon::now('PST')
OR Carbon::now('Continent/City'),例如(Carbon::now('America/Montreal')
这似乎是因为您的服务器的时区与您自己的时区不同。
这可能是由以下原因引起的:
- 服务器配置错误
- 服务器的物理位置位于不同的时区
- 提供商的策略也可能导致此问题。如果您的提供商决定他们希望在他们在世界各地拥有的每台服务器上以相同的时区运行,这将导致问题。
如您所描述,服务器的时区似乎是 CET(中欧时间),即 +1 GMT。
要解决此问题,您应该更改php.ini
文件中的时区(说明来自链接):
- 打开
php.ini
文件 - 将以下代码行添加到 php.ini 文件的顶部:
日期.时区 ="美国/中部"
或者,如果您希望 PHP 使用其他时区,则应将US/Central
时区替换为此处概述的所需时区。
在配置/应用程序中更改时区.php
'timezone' => 'YOUR TIME ZONE',
对于其他想知道为什么(有时)Carbon::now() 结果与新的 DateTime() 不同的人:
运行以下...
public function time()
{
$date = Carbon::now();
echo $date;
echo "<BR>";
return $date;
}
让我明白发生了什么。它打印了:
2020-09-09 18:03:15"2020-09-09T13:33:15.824992Z
"
第一个是正确的,它的时区是在config/app.timezone中设置的时区。调用新的日期时间()的结果相同。第二个是拉拉维尔控制器的结果。它以 UTC 时区显示日期。这就是laravel转换它的方式(使用Carbon的toJSON方法)。但是日期的时区是正确的并且正在运行:
$anotherDate = Carbon::parse('2020-09-09 18:30:00');
echo "diff_mins : " . $anotherDate->diff($date)->i;
显示:
diff_mins : 26
不出所料。
更改时区有两种主要方法。
选项 1
从项目根目录中,打开config
目录。
接下来编辑app.php
文件,并从可用时区列表中编辑从 UTC 到所需时区的timezone
值。
'timezone' => 'Asia/YOUR_LOCATION',
选项 2
在.env
文件中进行修改以指定时区,如下所示:
APP_TIMEZONE='Asia/YOUR_LOCATION'
然后,在app.php
文件中添加以下内容:
'timezone' => env('APP_TIMEZONE', 'UTC'),
最后
php artisan config:clear