2

何らかの理由で、strtotime('+1 month) が機能しません。これが私のコードです。

$Date   = $_REQUEST['date']; //This is a unix time stamp
$Start  = $_REQUEST['start']; //This is a unix time stamp
$End    = $_REQUEST['end']; //This is a unix time stamp

私の日付に月を追加します。

$monStart =strtotime('+1 month', $Start);
$monEnd   =strtotime('+1 month', $End);
$monDate  =strtotime('+1 month', $Date);

次に、変更された日付を表示します。

$vEnd = date('m/d/Y', $monEnd);
$vStart = date('m/d/Y', $monStart);
$vDate = date('m/d/Y', $monDate);

私が抱えている問題は、提供された日付です。

$Date = 1/31/2013
$Start = 1/01/2013
$End = 1/31/2013

戻る;

$vDate = 3/03/2013
$vStart = 2/01/2013 //Only correct one
$vEnd = 3/03/2013

誰か助けてください。

4

2 に答える 2

2

今日は 1 月 31 日であるため、3 月にジャンプします。1 か月追加すると、存在しない 2 月 31 日になるため、次の有効な日付に移動します。これは PHP のバグです。詳細については、https://bugs.php.net/bug.php?id=44073を参照してください。

DateTimeこのシナリオを克服するために試すことができます。この機能を要件に使用できます

function add_month($date_value, $months, $format = 'm/d/Y') {
    $date = new DateTime($date_value);
    $start_day = $date->format('j');

    $date->modify("+{$months} month");
    $end_day = $date->format('j');

    if ($start_day != $end_day)
        $date->modify('last day of last month');

    return $date->format($format);
}

今すぐ呼び出すことができます:

$vEnd = add_month($monEnd, 1);
$vStart = add_month($monStart, 1);
$vDate = add_month($monDate, 1); 

これにより、次のことが得られます。

$vDate = '02/28/2013';
$vStart = '02/01/2013';
$vEnd = '02/28/2013';

これがお役に立てば幸いです:)

于 2013-04-16T18:04:28.587 に答える
1

DateTimeは、月の日数などを考慮するため、日付計算の処理にはるかに優れています。

$dt = new DateTime('2013-02-01');
$dt->modify('+1 month');
echo $dt->format('Y-m-d');

実際に見る

タイムスタンプを使用しているため、次のようになります。

$dt = new DateTime('@'.$_REQUEST['start']);
$dt->modify('+1 month');
echo $dt->format('m/d/Y');
于 2013-04-16T17:47:26.467 に答える