PHP对于我的时区而言,一周的第一天不正确

Mat*_*lin 5 php timezone laravel php-carbon homestead

这里有个奇怪的问题。

我正在使用Laravel,但我可以确定它本身与它无关,并且我的Carbon日期总是返回“星期一”作为一周的第一天。问题是,我所在的语言环境应返回“星期日”。

/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/

'timezone' => 'America/Montreal',
Run Code Online (Sandbox Code Playgroud)

创建一个碳日期并打印:

<?php
$date = Carbon::now();
var_dump($date);
Run Code Online (Sandbox Code Playgroud)

产出

object(Carbon\Carbon)[278]
    public 'date' => string '2016-06-22 06:05:18.000000' (length=26)
    public 'timezone_type' => int 3
    public 'timezone' => string 'America/Montreal' (length=16)
Run Code Online (Sandbox Code Playgroud)

如果我打印一周的第一天

<?php var_dump($date->getWeekStartsAt());
Run Code Online (Sandbox Code Playgroud)

我懂了

1
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我进入我的家用控制台并输入“ locale”,我会得到:

LANG=en_US.UTF-8
LANGUAGE=en_US:
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)

所以我的默认语言环境应该是美国,对吗?根据Google的说法,在美国,加拿大和日本的一周中的第一天是星期日...运行“ locale first_weekday”收益:1(星期一)

所以我不确定我应该或可以做些什么来解决此问题,因为这是完全不正确的。我有一个根据机器区域设置绘制的日历,这显然是错误的,因此它向我的客户显示了不适合其区域设置的日历。

感谢您分享您的想法!


编辑#1

这是Carbon问题的链接:https : //github.com/briannesbitt/Carbon/issues/680

imp*_*eto 5

试试这个:在AppServiceProvider::boot()方法中像这样设置一周的开始和结束:

Carbon\Carbon::setWeekStartsAt(Carbon\Carbon::SUNDAY);
Carbon\Carbon::setWeekEndsAt(Carbon\Carbon::SATURDAY);
Run Code Online (Sandbox Code Playgroud)

您必须设置一周的开始和结束时间。将一周的开始设置为星期日将使一周只有一天。


cod*_*dge 4

该方法getWeekStartsAt()返回一个静态属性

protected static $weekStartsAt = self::MONDAY;
Run Code Online (Sandbox Code Playgroud)

哪个设置为self::MONDAY哪个解析为1。这就是为什么你得到1.

您可以致电setWeekStartsAt($day)设置正确的一周开始日期。当然,接下来你需要打电话setWeekEndsAt($day)

$date->setWeekStartsAt(0);
$date->setWeekEndsAt(6);
// Or better
$date->setWeekStartsAt(Carbon::SUNDAY);
$date->setWeekEndsAt(Carbon::SATURDAY);
Run Code Online (Sandbox Code Playgroud)