15

我刚开始使用 Carbon 扩展(到目前为止看起来很不错),但对Carbon::now()功能感到困惑。根据文档,这个函数似乎应该反映用户当前时区的当前时间,但是,我似乎得到了一个比格林威治标准时间早一个小时的时间。

Carbon::now()2015-01-01 17:26:46当我在 PST 时,实际上是当前2015-01-01 08:26:46

我是否必须为所有实例检测并输入用户本地时区?

是什么赋予了?(我很可能对网站如何在本地获取用户存在根本性的误解)

4

4 回答 4

17

Carbon 是基于 UTC 的,因此只需执行Carbon::now()将输出 UTC 格式的时间

您必须指定时区才能准确反映您所在城市或地区的日期时间。

有两种方法可以做到这一点。你可以这样做:

Carbon::now('PST')Carbon::now('Continent/City'(Carbon::now('America/Montreal') )例如

于 2015-11-20T02:25:33.817 回答
11

这似乎是因为您的服务器的时区与您自己的不同。

这可能是由以下原因引起的:

  • 服务器配置错误
  • 服务器的物理位置在不同的时区
  • 您的提供商的政策也可能导致这种情况。如果您的提供商决定他们希望在他们在世界各地拥有的每台服务器上使用相同的时区,这将导致问题。

如您所述,服务器的时区似乎是 CET(中欧时间),即 +1 GMT。

要解决此问题,您应该更改php.ini文件中的时区(说明来自链接):

  1. 打开你的php.ini文件
  2. 将以下代码行添加到 php.ini 文件的顶部:

date.timezone = "美国/中部"

或者,如果您希望 PHP 使用另一个时区,则应使用此处概述US/Central的所需时区替换时区。

于 2015-01-01T17:36:18.470 回答
8

在 config/app.php 中更改您的时区

 'timezone' => 'YOUR TIME ZONE',
于 2019-02-28T11:43:37.470 回答
1

对于其他想知道为什么(有时)Carbon::now()结果与new 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 中设置的。调用 new DateTime() 结果相同。第二个是laravel控制器的结果。它以 UTC 时区显示日期。这就是 laravel 转换它的方式(使用 Carbon 的 toJSON 方法)。但是日期的时区是正确的并且正在运行:

$anotherDate = Carbon::parse('2020-09-09 18:30:00');
echo "diff_mins : " . $anotherDate->diff($date)->i;

显示:

diff_mins : 26

正如预期的那样。

于 2020-09-09T13:37:16.283 回答