2017-02-23 22 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 

注意,在第四行中,$dateTime值爲2017-12-31 23:59:59。那是因爲在第三行。

但是爲什麼?我知道,碳的startOfYear()是一種改性劑,但是我們怎麼能因此獲得當年的一個日期的開始,而無需修改本身

預計:

$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號線。實際上,第四行輸出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()'是!謝謝! – doncadavona

相關問題