Как получить дату следующего месяца с сегодняшней даты и вставить ее в мою базу данных?
У меня есть два столбца в моем db: 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.
Ответы
Ответ 1
Вы можете использовать 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)));
Ответ 2
Принятый ответ работает, только если вы хотите ровно 31 день спустя. Это означает, что если вы используете дату "2013-05-31", которую вы ожидаете не в июне, но это не то, что я хотел.
Если вы хотите иметь следующий месяц, я предлагаю вам использовать текущий год и месяц, но продолжайте использовать 1-й.
$date = date("Y-m-01");
$newdate = strtotime ( '+1 month' , strtotime ( $date ) ) ;
Таким образом, вы сможете получить месяц и год следующего месяца без пропусков месяца.
Ответ 3
На самом деле вам не нужны функции 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
Ответ 4
Будьте осторожны, потому что иногда strtotime("+1 months")
может пропускать номера месяца.
Пример:
$today = date("Y-m-d"); // 2012-01-30
$next_month = date("Y-m-d", strtotime("$today +1 month"));
Если сегодня январь, в следующем месяце должен быть февраль, который имеет 28 или 29 дней, но PHP вернется в марте в следующем месяце, а не в феврале.
Ответ 5
Если вы хотите указать конкретную дату в следующем месяце, вы можете сделать это:
// 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
Ответ 6
Вы можете использовать strtotime(), как в примере Gazler, что отлично подходит для этого случая.
Если вам нужно более сложное управление, используйте mktime().
$end_date = mktime(date("H"), date("i"), date("s"), date("n") + 1, date("j"), date("Y"));
Ответ 7
Добавление моего решения здесь, так как это тема, которая входит в поиск 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
Ответ 8
Эта функция возвращает любое правильное количество месяцев положительно или отрицательно. Находится в разделе здесь:
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;
}
Ответ 9
01-Feb-2014
$date = mktime( 0, 0, 0, 2, 1, 2014 );
echo strftime( '%d %B %Y', strtotime( '+1 month', $date ) );
Ответ 10
date("Y-m-d",strtotime("last day of +1 month",strtotime($anydate)))
Ответ 11
Я думаю, что это похоже на ответ kouton, но этот только что занимает времяStamp и возвращает отметку времени SOMEWHERE в следующем месяце. Вы можете использовать дату ( "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);
}
Ответ 12
Я знаю - вроде как поздно. Но я работал над той же проблемой. Если клиент покупает месяц обслуживания, он/она ожидает закончить его месяц спустя. Вот как я это решил:
$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 года.