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/scribles/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とおりです。

Q: 「月」を正確にどのように定義しますか?

Def#1): 「月」は「月」です - #/days に関係なく

Def#2): 「月」は 30 日です (例)

Def#3): 「月」は、後続の月の最初の月曜日の間の # 日です。

などなど

Q: あなたの「定義」とは正確には何ですか?

于 2012-05-23T16:45:05.887 に答える
0

OK - 私が知る限り、あなたはまだ「月」の意味を明確に定義していません.

しかし、ここに役立つかもしれないもう1つの機能があります:

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 に答える