2017-02-23 110 views
0

Проверьте это самостоятельно пояснительная код в PHP:Как начать и или конец года экземпляра Carbon без изменения его в процессе?

Реальность:

$dateTime = Carbon::createFromDateTime(2017, 2, 23); 

echo $dateTime; // 2017-02-23 00:00:00 

echo $dateTime->startOfYear(); // 2017-12-31 23:59:59 

echo $dateTime; // 2017-12-31 23:59:59 

Обратите внимание, что на 4-й строке значение $dateTime является 2017-12-31 23:59:59. Это потому, что на 3-й линии.

Но почему? Я знаю, что startOfYear Carbon (в) модификатор, но как мы можем таким образом получить хороший старт Дейта года, не изменяя себе

Прогнозный:

$dateTime = Carbon::createFromDateTime(2017, 2, 23); 

echo $dateTime; // 2017-02-23 00:00:00 

echo $dateTime->startOfYear(); // 2017-12-31 23:59:59 

echo $dateTime; // 2017-02-23 00:00:00 

Выше, обратите внимание на 4-ю строчку. В действительности, 4-я строка выводит 2017-12-31 23:59:59.

+0

Вы применяете модификатор к экземпляру углерода. Сначала вам нужно кэшировать его в какой-то другой переменной и сделать это там. Это гарантирует, что ваш оригинал безопасен. Итак '$ modifiedDate = $ dateTime; $ modifiedDate-> startOfYear(); ' –

+0

Это было бы дорого. Для этого потребуется повторное создание одного и того же экземпляра той же даты для каждой операции: возможно, начните год с этой даты, затем получите конец месяца, начало месяца, начало дня, конец дня и т. Д. Не существует любой другой более элегантный способ? – doncadavona

+0

Ницца, проверяя ответы ниже. – doncadavona

ответ

3

использование copy()

Из docs

Вы также можете создать копию() существующего экземпляра углерода. Поскольку ожидал, что значения даты, времени и времени будут скопированы в новый экземпляр .

$dt = Carbon::now(); 
echo $dt->diffInYears($dt->copy()->addYear()); // 1 

// $dt was unchanged and still holds the value of Carbon:now() 
+0

Хороший ответ, но не уверен, имеет ли какое-либо большое преимущество над созданием новой переменной? –

+1

Вы можете, в зависимости от вашего использования, время от времени вы просто хотите вывести его один раз и забыть об этом, поэтому нет необходимости создавать новую переменную. – SteD

+0

Спасибо! 'copy()' хранит текущее значение экземпляра. Это то, что мне нужно было точно. – doncadavona

0

Вы заменить значение переменной $ даты и времени в строке 3. Эффективно:

$a = 1; 
echo $a; 
$a = 2; 
echo $a; 

Чтобы это исправить, вам нужно будет сделать что-то вроде этого:

$dateTime = Carbon::createFromDateTime(2017, 2, 23); 

$startTime = $dateTime; 

echo $dateTime->startOfYear(); 

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

1

Как и в случае с @SteD, вы можете использовать функцию копирования, чтобы получить существующий экземпляр и не изменять его.

$date = Carbon::createFromDate(2017, 2, 23); 

$startOfYear = $date->copy()->startOfYear(); 
$endOfYear = $date->copy()->endOfYear(); 
+0

'copy()' is! Благодаря! – doncadavona

 Смежные вопросы

  • Нет связанных вопросов^_^