2016-06-22 3 views
3

странная проблема здесь.PHP Неверный первый день недели для моего часового пояса

Я использую Laravel, но я уверен, что это не имеет никакого отношения к этому самому, и мои даты углерода всегда возвращаются «понедельника» в первый день недели. Проблема в том, что я в локали, где он должен возвращать «воскресенье».

/* 
|-------------------------------------------------------------------------- 
| 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', 

Создать дату Углерод и распечатать его:

<?php 
$date = Carbon::now(); 
var_dump($date); 

Выходы

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) 

И если я печать первый день недели

<?php var_dump($date->getWeekStartsAt()); 

я

1 

Как ни странно, если я иду в приусадебных консоль и введите «локаль», я получаю:

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 

Так что мой локаль по умолчанию должна быть США правильно? Согласно Google, первый день недели в США, Канаде и Японии - воскресенье ... Запуск «locale first_weekday» дает: 1 (понедельник)

Так что я не уверен, что я должен или могу сделать, чтобы исправить это, поскольку это совершенно неверно. У меня есть календарь, созданный на основе машинного языка, и это явно неправильно, поэтому он показывает моим клиентам календарь, который не соответствует их языку.

Спасибо, что поделились своими мыслями!


EDIT # 1

Вот ссылка на вопрос Carbon: https://github.com/briannesbitt/Carbon/issues/680

+0

При поиске в https://github.com/briannesbitt/Carbon/blob/master/src/Carbon/Carbon.php, я не могу видеть, где используется setWeekStartsAt. Может быть, Carbon не делает это автоматически?Кроме того, в своих тестах они действительно не проверяют его с помощью реального часового пояса, но вручную: https://github.com/briannesbitt/Carbon/blob/master/tests/Carbon/DayOfWeekModifiersTest.php – Sw0ut

ответ

1

Метод getWeekStartsAt() возвращает статическое свойство

protected static $weekStartsAt = self::MONDAY; 

, который установлен в self::MONDAY, который разрешает 1. Вот почему вы получаете 1.

Вы можете позвонить setWeekStartsAt($day), чтобы установить правильный день начала недели. Конечно, тогда вам нужно позвонить setWeekEndsAt($day).

$date->setWeekStartsAt(0); 
$date->setWeekEndsAt(6); 
// Or better 
$date->setWeekStartsAt(Carbon::SUNDAY); 
$date->setWeekEndsAt(Carbon::SATURDAY); 
+0

Я открыл ошибку на Углерод, это, скорее всего, не предполагаемое поведение и действительно бессмысленно! Кто хотел бы установить это вручную при каждом запуске своего приложения. Он должен исходить из локали, которая является следующей реальной проблемой, почему я получаю понедельник, когда мой язык установлен в США или ЦА. –

+0

@MathieuDumoulin Я могу понять вашу реакцию. Не могли бы вы поделиться ссылкой на сообщение об ошибке? Мне также было бы интересно, что создатель говорит – codedge

+0

Добавлено в главный вопрос в качестве редактирования –

0

Попробуйте это: в AppServiceProvider::boot() методе установить начало и конец недели, как это:

Carbon\Carbon::setWeekStartsAt(Carbon\Carbon::SUNDAY); 
Carbon\Carbon::setWeekEndsAt(Carbon\Carbon::SATURDAY); 

Вы должны установить как начало и конец недели. Установка только начала недели в воскресенье сделает неделю только днем.