Как мне получить дату следующего месяца от сегодняшней даты и вставить ее в мою базу данных? - PullRequest
30 голосов
/ 01 декабря 2010

В моей базе данных есть два столбца: start_date и end_date, которые оба являются 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 + один месяц?Например, 2000- 10 -01 станет 2000- 11 -01.

Ответы [ 12 ]

77 голосов
/ 01 декабря 2010

Вы можете использовать функцию 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)));
18 голосов
/ 01 июня 2013

Принятый ответ работает, только если вы хотите ровно 31 день спустя. Это означает, что если вы используете дату «2013-05-31», которую вы ожидаете не в июне, а это не то, что я хотел.

Если вы хотите иметь следующий месяц, я предлагаю вам использовать текущий год и месяц, но продолжайте использовать 1-й.

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

Таким образом, вы сможете получить месяц и год следующего месяца, не пропустив месяц.

17 голосов
/ 01 декабря 2010

На самом деле вам не нужны функции 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

14 голосов
/ 13 февраля 2015

Если вам нужна конкретная дата в следующем месяце, вы можете сделать это:

// 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
13 голосов
/ 23 ноября 2012

Будьте осторожны, потому что иногда strtotime("+1 months") может пропускать номера месяцев.

Пример:

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

Если сегодня январь, то следующим месяцем должен быть февраль с 28 или 29 днями, но PHP вернет март как следующий месяц, а не февраль.

1 голос
/ 02 ноября 2018

Добавление моего решения здесь, так как это тема, которая входит в поиск Google. Это делается для получения следующей даты месяца, исправления любых пропусков, сохранения следующей даты в следующем месяце.

PHP добавляет общее количество дней в текущей дате к текущей дате, например, если вы делаете +1 month.

Таким образом, применение +1 month к 30-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 голос
/ 01 декабря 2010

Вы можете использовать strtotime () , как в примере Газлера, что отлично подходит для этого случая.

Если вам нужно более сложное управление, используйте mktime () .

$end_date = mktime(date("H"), date("i"), date("s"), date("n") + 1, date("j"), date("Y"));
0 голосов
/ 07 мая 2019

Я знаю - вроде как поздно. Но я работал над той же проблемой. Если клиент покупает месяц обслуживания, он / она ожидает закончить его месяц спустя. Вот как я это решил:

    $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 <= 12). Если служба запущена 31 марта 2019 года и работает в течение 11 месяцев, она заканчивается 29 февраля 2020 года. Если она работает только один месяц, дата окончания - 30 апреля 2019 года. </p>

0 голосов
/ 12 октября 2017

Я думаю, что это похоже на ответ Кутона, но этот просто берет метку времени и возвращает метку времени ГДЕ-ТО в следующем месяце.Вы можете использовать дату ("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 голосов
/ 19 ноября 2015
date("Y-m-d",strtotime("last day of +1 month",strtotime($anydate)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...