去年,今年,明年,用php DateTime

去年,今年,明年,用php DateTime,php,datetime,Php,Datetime,我正在尝试创建一个dropbox,它将使用php DateTime对象显示上一年、当前一年和下一年 在我当前的代码中,我创建了三个对象,并且必须对其中两个对象调用一个方法。这似乎有点耗费资源 $today = new DateTime(); $last_year=new DateTime(); $last_year->sub(new DateInterval('P1Y')); $next_year = new DateTime(); $next_year->add(new DateI

我正在尝试创建一个dropbox,它将使用php DateTime对象显示上一年、当前一年和下一年

在我当前的代码中,我创建了三个对象,并且必须对其中两个对象调用一个方法。这似乎有点耗费资源

$today = new DateTime();
$last_year=new DateTime();
$last_year->sub(new DateInterval('P1Y'));
$next_year = new DateTime();
$next_year->add(new DateInterval('P1Y'));
echo date_format($last_year, 'Y').' '.date_format($today, 'Y').' '.date_format($next_year, 'Y');
我发现的另一种只使用1个对象的方法是

$today = new DateTime();
echo date_format($today->sub(new DateInterval('P1Y')), 'Y').' '.date_format($today->add(new DateInterval('P1Y')), 'Y').' '.date_format($today->add(new DateInterval('P1Y')), 'Y');
但这将变得非常混乱。
有人能告诉我使用
DateTime()?因为我几个月都需要类似的东西吗?

试试这个。这相当有效

 echo date("Y");   
 echo date("Y",strtotime("-1 year"));
echo date("Y",strtotime("+1 year"))

可能您还可以通过创建一个对象并将其用于所有三个计算来限制调用
new DateInterval('P1Y')

$interval = new DateInterval('P1Y');

$dateTime = new DateTime();
$lastYear = $dateTime->sub($interval)->format('Y');

$dateTime = new DateTime();
$nextYear = $dateTime->add($interval)->format('Y');

$dateTime = new DateTime();
$thisYear = $dateTime->format('Y');

echo $lastYear . ' ' . $thisYear . ' ' . $nextYear;
通过将单个字符串分解为多个命令,可以帮助我减少混淆。

只需使用基本数学:

<?php

$d = new DateTime('now');
$cy = $d->format('Y'); 

// Get previous year 
$d->modify('-1 year');
$py = $d->format('Y');

//Next year : Since object has previous year, so +2 to get next year
$d->modify('+2 year');
$ny = $d->format('Y');

echo "Previous Year: ".$py."<br>";
echo "Current Year : ".$cy."<br>";
echo "Next Year : ".$ny."<br>";

$d = new DateTime('now');
$cm = $d->format('m'); 

$d->modify('-1 month');
$pm = $d->format('m'); 

$d->modify('+2 month');
$nm = $d->format('m');

echo "Previous Month: ".$pm."<br>";
echo "Current Month : ".$cm."<br>";
echo "Next Month : ".$nm."<br>";
?>
$current=日期('Y');
$prev=$current-1;
$next=$current+1;

根据您的PHP版本(>=5.4),您可以对其进行如下整理:-

$today = new DateTime();
$last_year=(new DateTime())->sub(new DateInterval('P1Y'));
$next_year = (new DateTime())->add(new DateInterval('P1Y'));
echo $last_year->format('Y').' '.$today->format('Y').' '.$next_year->format('Y');

更具可读性和简洁性的选项可能是使用
\datetimeimmunitable

$today = new DateTimeImmutable();
$one_year = new DateInterval('P1Y');

$last_year = $today->sub($one_year);
$next_year = $today->add($one_year);
echo $last_year->format('Y').' '.$today->format('Y').' '.$next_year->format('Y');


除此之外,这一切看起来都很好。当需要优化时,请担心。

在阅读了所有答案后,我想出了这个函数来创建一个年度下拉框。 $name是该文件的名称 $year\u number是要显示的年数 此功能从当前年份的前一年开始,但您可以轻松地修改它以从较早年份开始显示

function drop_down_box_date_year(&$dbconn, $name, $year_number){
$today = new DateTime();
$interval = new DateInterval('P1Y');
$startyear = (new DateTime())->sub($interval);
echo '<select name="'.$name.'_year">';
for($i=0;$i<$year_number;$i++){ 
    if($startyear->format('Y')==$today->format('Y')){
        echo '<option value="'.$startyear->format('Y').'" selected>'.$startyear->format('Y').'</option>';           
    }else{
        echo '<option value="'.$startyear->format('Y').'">'.$startyear->format('Y').'</option>';
    }
    $startyear->add($interval);
}
echo'</select>';
函数下拉框日期年份(&$dbconn、$name、$year\u number){
$today=新日期时间();
$interval=新日期间隔('P1Y');
$startyear=(new DateTime())->sub($interval);
回声';
对于($i=0;$iformat('Y')==$today->format('Y')){
回显'.$startyear->格式('Y');
}否则{
回显'.$startyear->格式('Y');
}
$startyear->add($interval);
}
回声';

}

OP指定使用php DateTime对象,否则okQuestion说他使用的方式似乎很繁重,占用了很多资源,所以我给出了另一种方法来节省时间和空间。很抱歉,我应该指定使用DateTime()对象来避免2038时间错误可能出现的任何问题。这也是一种尝试让自己进入OO编程的方式。谢谢你的建议。混合使用过程式和面向对象的风格有什么特殊用途吗<代码>日期格式($today->sub($interval),'Y')可以很容易地
$today->sub($interval)->格式('Y')但这会给你去年、前年和前年的信息。不是OP要求的。@vascowhite你是对的,更正了代码。但最后一个答案是基于问题代码的内容。
“这似乎对资源来说有点沉重。”
如果它成为一个问题,请担心它。我不想使用date(),因为2038年的时间错误。@anatak:*@anatak:我希望在2038年所有机器都是64位或更多位的,这样简单的
日期('Y')就不会有这个问题;)我认为历史告诉我们,我们使用东西的时间比最初计划的要长得多。COBOL应用程序目前仍在运行,设计于70-80年代,和平号空间站、哈勃望远镜和许多核电站在设计到期日后仍在使用。我认为最好是设计一些尽可能经得起未来考验的东西。@anatak:stiil,我认为这有点不同,因为今天已经有64位服务器(至少我所有的主机都是这样),在2038年以后,
date('Y')
仍在工作。但是好的,如果您不想使用
date()
只需使用
date\u create()->格式('Y')
(新日期时间)->格式('Y')
。正在寻找这样简洁的东西。我当时正在做
((new DateTime())->format('Y'))-1
,但这种类型在进行减法运算时将DateTime转换为int。
function drop_down_box_date_year(&$dbconn, $name, $year_number){
$today = new DateTime();
$interval = new DateInterval('P1Y');
$startyear = (new DateTime())->sub($interval);
echo '<select name="'.$name.'_year">';
for($i=0;$i<$year_number;$i++){ 
    if($startyear->format('Y')==$today->format('Y')){
        echo '<option value="'.$startyear->format('Y').'" selected>'.$startyear->format('Y').'</option>';           
    }else{
        echo '<option value="'.$startyear->format('Y').'">'.$startyear->format('Y').'</option>';
    }
    $startyear->add($interval);
}
echo'</select>';