我的数据库中有两列: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。
答案 0 :(得分:76)
您可以使用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)));
答案 1 :(得分:18)
只有在31天之后才能获得所接受的答案。这意味着如果您使用的日期为“2013-05-31”,那么您希望在6月份不会出现我想要的日期。
如果您想要下个月,我建议您使用当前年份和月份,但继续使用第1个月。
$date = date("Y-m-01");
$newdate = strtotime ( '+1 month' , strtotime ( $date ) ) ;
通过这种方式,您可以在不跳过月份的情况下获得下个月的月份和年份。
答案 2 :(得分:17)
您实际上并不需要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
答案 3 :(得分:13)
请注意,因为有时strtotime("+1 months")
可以跳过月份数字。
示例:
$today = date("Y-m-d"); // 2012-01-30
$next_month = date("Y-m-d", strtotime("$today +1 month"));
如果今天是1月,下个月应该是2月28天或29天,但PHP会在3月份返回,而不是2月份。
答案 4 :(得分:13)
如果您希望下个月有特定日期,可以执行以下操作:
// 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
答案 5 :(得分:1)
你可以在Gazler的例子中使用strtotime(),这对于这种情况很有用。
如果您需要更复杂的控制,请使用mktime()。
$end_date = mktime(date("H"), date("i"), date("s"), date("n") + 1, date("j"), date("Y"));
答案 6 :(得分:1)
在这里添加我的解决方案,因为这是google搜索中的主题。这是为了获取月份的下一个日期,修复所有跳过,将下一个日期保持在下个月之内。
例如,如果您执行+1 month
,PHP会将当前月份的总天数添加到当前日期。
因此将+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
答案 7 :(得分:0)
此函数正或负地返回任何正确的月数。找到comment section here:
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;
}
答案 8 :(得分:0)
2014年2月1日
$date = mktime( 0, 0, 0, 2, 1, 2014 );
echo strftime( '%d %B %Y', strtotime( '+1 month', $date ) );
答案 9 :(得分:0)
date("Y-m-d",strtotime("last day of +1 month",strtotime($anydate)))
答案 10 :(得分:0)
我认为这与kouton的答案类似,但是这个只需要一个timeStamp并在下个月返回一个时间戳。你可以从那里使用日期(“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);
}
答案 11 :(得分:0)
我知道-有点晚了。但是我当时在解决同样的问题。如果客户购买了一个月的服务,他/她希望在一个月后终止服务。这是我解决的方法:
$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)。如果该服务于2019年3月31日开始并运行11个月,则将在2020年2月29日结束。如果仅运行1个月,则结束日期为2019年4月30日。
答案 12 :(得分:0)
$ nextm = date('m',strtotime('+ 1 month',strtotime(date('Y-m-01')))));
答案 13 :(得分:0)
这样做的一种方法是 - 首先获取当前月份的最后日期,然后添加 1 天,以获得下个月的第一个日期。这将防止我们在使用“+1 个月”时无意中跳过月份。
$today_date = date("Y-m-d");
$last_date_of_month=date('Y-m-t',strtotime($today_date);//get last date of current month
$last_day_of_month_proper =strtotime($last_day_of_month);
$new_date=date('Y-m-d', strtotime('+1 day',$last_day_of_month_proper));
echo $new_date;