web-dev-qa-db-ja.com

今日の日付から来月の日付を取得してデータベースに挿入するにはどうすればよいですか?

Dbには、start_dateend_dateの2つの列があり、どちらもDATE型です。私のコードは次のように日付を更新しています:

$today_date = date("Y-m-d");
$end_date = date("Y-m-d"); // date +1 month ??

$sql1 = "UPDATE `users` SET `start_date` = '".$today_date."', `end_date` = '".$end_date."'  WHERE `users`.`id` ='".$id."' LIMIT 1 ;";

$end_date$start_date + 1か月に等しくするための最良の方法は何ですか?たとえば、2000 -1-01は2000 -11-01になります。

32
Saleh

PHPの strtotime() 関数を使用できます。

// One month from today
$date = date('Y-m-d', strtotime('+1 month'));

// One month from a specific date
$date = date('Y-m-d', strtotime('+1 month', strtotime('2015-01-01')));

+1 monthは常に直感的に計算されるとは限りません。現在の月に存在する日数を常に追加するようです。

Current Date  | +1 month
-----------------------------------------------------
2015-01-01    | 2015-02-01   (+31 days)
2015-01-15    | 2015-02-15   (+31 days)
2015-01-30    | 2015-03-02   (+31 days, skips Feb)
2015-01-31    | 2015-03-03   (+31 days, skips Feb)
2015-02-15    | 2015-03-15   (+28 days)
2015-03-31    | 2015-05-01   (+31 days, skips April)
2015-12-31    | 2016-01-31   (+31 days)

使用できる他の日付/時間間隔:

$date = date('Y-m-d'); // Initial date string to use in calculation

$date = date('Y-m-d', strtotime('+1 day', strtotime($date)));
$date = date('Y-m-d', strtotime('+1 week', strtotime($date)));
$date = date('Y-m-d', strtotime('+2 week', strtotime($date)));
$date = date('Y-m-d', strtotime('+1 month', strtotime($date)));
$date = date('Y-m-d', strtotime('+30 days', strtotime($date)));
79
Gazler

受け入れられた答えは、正確に31日後に必要な場合にのみ機能します。つまり、「2013-05-31」という日付を使用している場合、6月にはないことが予想されますが、これは私が望んでいたものではありません。

翌月にしたい場合は、現在の年と月を使用し、1日目を使用し続けることをお勧めします。

$date = date("Y-m-01");
$newdate = strtotime ( '+1 month' , strtotime ( $date ) ) ;

これにより、月をスキップすることなく、翌月の月と年を取得できます。

19

実際にこれを実現するためにPHP関数は必要ありません。例えば、次のように、SQLで直接簡単な日付操作を直接行うことができます。

$sql1 = "
    UPDATE `users` SET 
    `start_date` = CURDATE(), 
    `end_date` = DATE_ADD(CURDATE(), INTERVAL 1 MONTH)  
    WHERE `users`.`id` = '" . $id . "';
";

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_addtime を参照してください

17
Anton S

来月の特定の日付が必要な場合、これを行うことができます。

// Calculate the timestamp
$expire = strtotime('first day of +1 month');

// Format the timestamp as a string
echo date('m/d/Y', $expire);

これは、+1 monthはわかりにくいかもしれません。例えば...

Current Day   | first day of +1 month     | +1 month
---------------------------------------------------------------------------
2015-01-01    | 2015-02-01                | 2015-02-01
2015-01-30    | 2015-02-01                | 2015-03-02  (skips Feb)
2015-01-31    | 2015-02-01                | 2015-03-03  (skips Feb)
2015-03-31    | 2015-04-01                | 2015-05-01  (skips April)
2015-12-31    | 2016-01-01                | 2016-01-31
14
Gil Prata

strtotime("+1 months")が月の番号をスキップすることがあるため、注意してください。

例:

$today = date("Y-m-d"); // 2012-01-30
$next_month = date("Y-m-d", strtotime("$today +1 month"));

今日が1月の場合、来月は28または29日の2月でなければなりませんが、PHPは2月ではなく3月を来月として返します。

13

Gazlerの例のように strtotime() を使用できます。これはこの場合に最適です。

より複雑な制御が必要な場合は、 mktime() を使用します。

$end_date = mktime(date("H"), date("i"), date("s"), date("n") + 1, date("j"), date("Y"));
1
Orbling

ここに私のソリューションを追加します。これはGoogle検索に含まれるスレッドです。これは、次の日付を取得し、スキップを修正し、次の日付を翌月内に維持することです。

たとえば、+1 monthを実行すると、PHPは現在の日付に現在の月の合計日数を追加します。

したがって、+1 month30-01-2016に適用すると、02-03-2016が返されます。 (31日を追加)

私の場合、来月以内に維持するために、28-02-2016を取得する必要がありました。そのような場合、以下のソリューションを使用できます。

このコードは、指定された日付が来月の合計日よりも大きいかどうかを識別します。その場合、日数をスマートに減算し、月の範囲内の日付を返します。

戻り値はタイムスタンプ形式であることに注意してください。

function getExactDateAfterMonths($timestamp, $months){
    $day_current_date            = date('d', $timestamp);
    $first_date_of_current_month = date('01-m-Y', $timestamp);
    // 't' gives last day of month, which is equal to no of days
    $days_in_next_month          = date('t',  strtotime("+".$months." months", strtotime($first_date_of_current_month)));

    $days_to_substract = 0;
    if($day_current_date > $days_in_next_month)
         $days_to_substract = $day_current_date - $days_in_next_month;

    $php_date_after_months   = strtotime("+".$months." months", $timestamp);
    $exact_date_after_months = strtotime("-".$days_to_substract." days", $php_date_after_months);

    return $exact_date_after_months;
}

getExactDateAfterMonths(strtotime('30-01-2016'), 1);
// $php_date_after_months   => 02-03-2016
// $exact_date_after_months => 28-02-2016
1
Shah Abaz Khan

私は知っている-ちょっと遅れた。しかし、私は同じ問題に取り組んでいました。クライアントが1か月間サービスを購入した場合、1か月後に終了することを期待しています。ここに私がそれを解決した方法があります:

    $now = time(); 
    $day = date('j',$now);
    $year = date('o',$now);
    $month = date('n',$now);
    $hour = date('G');
    $minute = date('i');
    $month += $count;
    if ($month > 12)        {
            $month -= 12;
            $year++; 
            }
    $work = strtotime($year . "-" . $month . "-01");
    $avail = date('t',$work);
    if ($day > $avail)
            $day = $avail;
    $stamp = strtotime($year . "-" . $month . "-" . $day . " " . $hour . ":" . $minute);

これは、現在からn * countか月後の正確な日を計算します(count <= 12)。サービスが2019年3月31日に開始され、11か月間実行される場合、2020年2月29日に終了します。1か月間のみ実行される場合、終了日は2019年4月30日です。

0
Michaela.Merz

この関数は、任意のcorrect月数を正または負で返します。 コメントセクションはこちら にあります:

function addMonthsToTime($numMonths = 1, $timeStamp = null){
    $timeStamp === null and $timeStamp = time();//Default to the present
    $newMonthNumDays =  date('d',strtotime('last day of '.$numMonths.' months', $timeStamp));//Number of days in the new month
    $currentDayOfMonth = date('d',$timeStamp);

    if($currentDayOfMonth > $newMonthNumDays){
      $newTimeStamp = strtotime('-'.($currentDayOfMonth - $newMonthNumDays).' days '.$numMonths.' months', $timeStamp);
    } else {
    $newTimeStamp = strtotime($numMonths.' months', $timeStamp);
    }

    return $newTimeStamp;
}
0
kouton

2014年2月1日

$date = mktime( 0, 0, 0, 2, 1, 2014 );

echo strftime( '%d %B %Y', strtotime( '+1 month', $date ) );
date("Y-m-d",strtotime("last day of +1 month",strtotime($anydate)))
0
leon

これはkoutonの答えに似ていると思いますが、これはちょうどtimeStampを取り込んで、来月にタイムスタンプSOMEWHEREを返します。そこからdate( "m"、$ nextMonthDateN)を使用できます。

function nextMonthTimeStamp($curDateN){ 
   $nextMonthDateN = $curDateN;
   while( date("m", $nextMonthDateN) == date("m", $curDateN) ){
      $nextMonthDateN += 60*60*24*27;
   }
   return $nextMonthDateN; //or return date("m", $nextMonthDateN);
}
0
rikkitikkitumbo