Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从今天起我如何获得下个月的日期';s日期并将其插入我的数据库?_Php_Mysql_Date - Fatal编程技术网

Php 从今天起我如何获得下个月的日期';s日期并将其插入我的数据库?

Php 从今天起我如何获得下个月的日期';s日期并将其插入我的数据库?,php,mysql,date,Php,Mysql,Date,我的数据库中有两列:start\u date和end\u 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`

我的数据库中有两列:
start\u date
end\u 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\u date
等于
$start\u date
+一个月的最佳方法是什么?例如,2000-10-01将变成2000-11-01。

您可以使用PHP的函数:

//从今天起一个月
$date=日期('Y-m-d',标准时间('1个月');
//从特定日期算起一个月
$date=日期('Y-m-d',标准时间('+1个月',标准时间('2015-01-01'));
请注意,
+1个月
并不总是直观地计算出来的。它似乎总是添加当前月份的天数

当前日期|+1个月
-----------------------------------------------------
2015-01-01 | 2015-02-01(+31天)
2015-01-15 | 2015-02-15(+31天)
2015-01-30 | 2015-03-02(+31天,跳过2月)
2015-01-31 | 2015-03-03(+31天,跳过2月)
2015-02-15 | 2015-03-15(+28天)
2015-03-31 | 2015-05-01(+31天,跳过4月)
2015-12-31 | 2016-01-31(+31天)
您可以使用的其他一些日期/时间间隔:

$date=date('Y-m-d');//要在计算中使用的初始日期字符串
$date=日期('Y-m-d',标准时间('+1天',标准时间($date));
$date=日期('Y-m-d',标准时间('+1周',标准时间($date));
$date=日期('Y-m-d',标准时间('+2周',标准时间($date));
$date=日期('Y-m-d',标准时间('+1个月',标准时间($date));
$date=日期('Y-m-d',标准时间('+30天',标准时间($date));
您可以使用Gazler的示例,这对于本例非常有用

如果您需要更复杂的控制使用


您实际上不需要PHP函数来实现这一点。您已经可以直接在SQL中执行简单的日期操作,例如:

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

请参阅

小心,因为有时strotime(“+1个月”)可以跳过月数

例如:

$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月。

只有在您希望恰好31天后返回时,接受的答案才有效。这意味着,如果你使用的日期是“2013-05-31”,你预计不会在6月份,这不是我想要的

如果你想要下一个月,我建议你使用当前年份和月份,但继续使用第一个

$date = date("Y-m-01");
$newdate = strtotime ( '+1 month' , strtotime ( $date ) ) ;
这样,您就可以在不跳过月份的情况下获取下一个月的月份和年份。

此函数可以正向或反向返回任何正确的月份数。可在以下目录中找到:

2014年2月1日

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

echo strftime( '%d %B %Y', strtotime( '+1 month', $date ) );

如果您想在下个月指定一个具体日期,可以执行以下操作:

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

// Format the timestamp as a string
echo date('m/d/Y', $expire);
请注意,在
+1个月
容易混淆的情况下,这种方法实际上更可靠。例如

当日|+1个月的第一天|+1个月
---------------------------------------------------------------------------
2015-01-01    | 2015-02-01                | 2015-02-01
2015-01-30 | 2015-02-01 | 2015-03-02(跳过2月)
2015-01-31 | 2015-02-01 | 2015-03-03(跳过2月)
2015-03-31 | 2015-04-01 | 2015-05-01(跳过4月)
2015-12-31    | 2016-01-01                | 2016-01-31

我认为这与kouton的答案类似,但这个答案只接收一个时间戳,并在下个月的某个地方返回一个时间戳。您可以在那里使用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);
}

在这里添加我的解决方案,因为这是谷歌搜索中的线程。这是为了获得下一个月的日期,修复任何跳过,将下一个日期保持在下一个月内

例如,如果您执行
+1个月的操作,PHP会将当前月份的总天数添加到当前日期

因此,将
+1个月
应用于
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

我知道,有点晚了。但我在研究同一个问题。如果客户购买了一个月的服务,他/她希望在一个月后结束服务。我是这样解决的:

    $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$nextm=date('m',strotime('+1个月',strotime(date('Y-m-01')))

这样做的一种方法是:首先获取当前月份的最后一个日期,然后再添加一天,以获取下个月的第一个日期。这将防止我们无意中跳过使用“+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;

谢谢你-我不知道PHP聪明到可以把
+1个月
变成一个时间!我认为PHP从当前时间算起+1个月(显然)?这是正确的。玩一玩吧,它还接受“下周四”、“上周二”和“+1周3天2小时4秒”之类的内容@JamWaffles和@SzamDev,当当前日期为1月31日时,你应该检查你对结果是否满意。带月的日期算术有时会给出意外的结果。如果日期为2014年1月30日或2014年1月31日,这将不起作用。我编辑了这个问题,以便更清楚地说明日期可能有点混乱。谢谢@DonKirkby.before answ时间(“+1个月”)
,看看如果
结束日期
总是
开始日期+1个月
,它不应该在表中。如果不是,这个评论不适用。我本来打算发布一个类似的答案,但我不太记得怎么做了-感谢发布解决方案。+1这会不会很慢?所有这些
日期()
函数?这些是t的默认值
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
    $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);
$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;