這種每隔一年產生 2 個日期字串的方式有些難看
$obj_now = new DateTime();
$obj_year_ago = new DateTime();
$obj_year_ago->modify( '- 1 year');
$string_now = $obj_now->format('Y-m-d') ;
$string_year_ago = $obj_year_ago->format('Y-m-d') ;
它有效,但對我來說似乎很笨重(因此可能效率低下)。
提出問題;如果我必須根據參考日期生成日期(這些以不同的方式以不同的形式使用)。每個日期是否需要一個物件,或者我可以執行計算以從一個 DateTime 物件生成我的字串嗎?
我看到的困難是如果我使用$obj_now->modify()` 它不再是“現在”
uj5u.com熱心網友回復:
Modify 更改 DateTime 物件,但不更改 format 方法。以下是您可以執行以下操作的方法:
$curDate = new DateTime('Now');
$dates = [];
for($i=0;$i<3;$i ){
$dates[] = $curDate->format('Y-m-d');
$curDate->modify('-1 year');
}
var_dump($dates);
//array(3) { [0]=> string(10) "2021-11-04" [1]=> string(10) "2020-11-04" [2]=> string(10) "2019-11-04" }
如果您不希望修改更改原始物件,則可以使用DateTimeImmutable。為了得到和上面一樣的結果,DateTimeImmutable的代碼是這樣的:
$date = new DateTimeImmutable('Now');
$dates = [];
for($i=0;$i<3;$i ){
$curDate = $date->modify('-'.$i.' year');
$dates[] = $curDate->format('Y-m-d');
}
var_dump($dates);
有關更多資訊,請參閱DateTimeImmutable 與 DateTime
uj5u.com熱心網友回復:
顯然,在 modify() 之后,日期時間已更改,不再是“現在”。但是您可以只使用一個物件來完成您的作業,只需更改您的指令順序:
$obj = new DateTime();
$string_now = $obj->format('Y-m-d');
$obj->modify('- 1 year');
$string_year_ago = $obj->format('Y-m-d');
uj5u.com熱心網友回復:
編輯:正如用戶 IMSoP 所提到的(謝謝!)日期物件引數被修改。因此,我更改了函式以使用物件的副本來防止這種情況發生。
我更愿意為它使用一個函式。首先,您可以,但不必宣告日期物件。其次,您在函式呼叫之前宣告的物件不會被修改,只是為了獲取您需要的資訊。
<?php
/**
* @param DateTime $dt_date
* @param String $s_format
* @param String $s_modifier
* @return String
*/
function dateGetFormatedStringModified($dt_date, $s_format, $s_modifier = ''){
$dt_temp = clone $dt_date;
if(!empty($s_modifier)){
$dt_temp->modify($s_modifier);
}
return $dt_temp->format($s_format);
}
$string_year_ago = dateGetFormatedStringModified(new DateTime(), 'Y-m-d', '- 1 year');
$string_now = dateGetFormatedStringModified(new DateTime(), 'Y-m-d');
echo $string_now; // 2021-11-04
echo $string_year_ago; // 2020-11-04
?>
不同的方法是 DateTimeImmutable。如果使用修改,這可以防止日期被更改。
$date = new DateTimeImmutable();
$date_last_year = $date->modify('-1 year');
echo $date->format('Y-m-d');
echo $date_last_year->format('Y-m-d');
您也可以在一行內結合修改和格式
$date = new DateTimeImmutable();
echo $date->format('Y-m-d');
echo $date->modify('-1 year')->format('Y-m-d');
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/348204.html
