20

可能重复:
PHP DateTime::modify 加减月份

我有一个开始日期(即 2011-01-30)并想增加 1 个月。

问题在于定义一个月是什么。因此,如果我使用以下代码:

$d1 = DateTime::createFromFormat('Y-m-d H:i:s', '2011-01-30 15:57:57');
$d1->add(new DateInterval('P1M'));
echo $d1->format('Y-m-d H:i:s');

我得到以下结果:2011-03-02 15:57:57

问题是,我需要它使用以下规则:

  • 如果我添加 1 个月,它只会在月份部分添加 1 并离开日期部分(2011-01-15 将变为 2011-02-15)
  • 如果在我们将结束的月份中不存在这一天,我们将取其最后一个存在的日期(2011-01-30 将变为 2011-02-28)

php中是否有一个通用函数可以做到这一点,还是我必须自己编写代码?也许我只是缺少一个参数或其他东西!?

4

3 回答 3

12

好像没有现成的函数,所以自己写的。这应该可以解决我的问题。无论如何,感谢您的回答和评论。如果您发现一些错误,请在评论中提供。

此函数计算添加一个月后我将结束的月份和年份。然后它检查日期是否正确。如果不是,我们会遇到该日期不在目标月份的情况,因此我们取该月份的最后一天。使用 PHP 5.3.10 测试。

<?php
$monthToAdd = 1;

$d1 = DateTime::createFromFormat('Y-m-d H:i:s', '2011-01-30 15:57:57');

$year = $d1->format('Y');
$month = $d1->format('n');
$day = $d1->format('d');

$year += floor($monthToAdd/12);
$monthToAdd = $monthToAdd%12;
$month += $monthToAdd;
if($month > 12) {
    $year ++;
    $month = $month % 12;
    if($month === 0)
        $month = 12;
}

if(!checkdate($month, $day, $year)) {
    $d2 = DateTime::createFromFormat('Y-n-j', $year.'-'.$month.'-1');
    $d2->modify('last day of');
}else {
    $d2 = DateTime::createFromFormat('Y-n-d', $year.'-'.$month.'-'.$day);
}
$d2->setTime($d1->format('H'), $d1->format('i'), $d1->format('s'));
echo $d2->format('Y-m-d H:i:s');
于 2012-05-24T09:39:46.187 回答
11

除了 DateInterval,您还有多种选择。

以下是使用的示例strtotime()

http://www.brightcherry.co.uk/scribbles/php-adding-and-subtracting-dates/

// Subtracting days from a date
$date = "1998-08-14";
$newdate = strtotime ( '-3 day' , strtotime ( $date ) ) ;
$newdate = date ( 'Y-m-j' , $newdate );

echo $newdate;

...

// Subtracting months from a date
$date = "1998-08-14";
$newdate = strtotime ( '-3 month' , strtotime ( $date ) ) ;
$newdate = date ( 'Y-m-j' , $newdate );

echo $newdate;

以下是一些链接DateInterval

问:您究竟如何定义“月”?

Def#1):“月”是“月”——与 #/days 无关

Def#2):一个“月”是 30 天(例如)

Def#3):“月”是随后几个月的第一个星期一之间的#/天

等等等等

问:你的“定义”到底是什么?

于 2012-05-23T16:45:05.887 回答
0

好的-据我所知,您还没有明确定义“月份”的含义。

但这里还有一个可能有帮助的功能:

http://php.net/manual/en/function.getdate.php

/* Function to find the first and last day of the month from the given date.
*
* Author Binu v Pillai            binupillai2003@yahoo.com
* @Param            String             yyyy-mm-dd
*
*/
function findFirstAndLastDay($anyDate)
{
    //$anyDate            =    '2009-08-25';    // date format should be yyyy-mm-dd
    list($yr,$mn,$dt)    =    split('-',$anyDate);    // separate year, month and date
    $timeStamp            =    mktime(0,0,0,$mn,1,$yr);    //Create time stamp of the first day from the give date.
    $firstDay            =     date('D',$timeStamp);    //get first day of the given month
    list($y,$m,$t)        =     split('-',date('Y-m-t',$timeStamp)); //Find the last date of the month and separating it
    $lastDayTimeStamp    =    mktime(0,0,0,$m,$t,$y);//create time stamp of the last date of the give month
    $lastDay            =    date('D',$lastDayTimeStamp);// Find last day of the month
    $arrDay                =    array("$firstDay","$lastDay"); // return the result in an array format.

    return $arrDay;
}
于 2012-05-23T19:14:40.203 回答