2010-11-30 22 views
25

Tengo dos columnas en mi db: start_date y end_date, que son ambas DATE tipos. Mi código es la actualización de la fecha de la siguiente manera:¿Cómo obtengo la fecha del mes próximo de la fecha de hoy e insértelo en mi base de datos?

$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 ;"; 

¿Cuál es la mejor manera de hacer $end_date igual a $start_date + un mes? Por ejemplo, 2000- -01 se convertiría en 2000- -01.

+0

antes de contestar 'strtotime ('+ 1 mes)', echar un vistazo a http://www.gnu.org/software/tar/manual/html_node/Relative-items-in-date-strings .html # SEC120 – Gordon

+0

Si 'end_date' es SIEMPRE' start_date + 1 month', no debería estar en la tabla. Si no, este comentario no se aplica. – Danosaure

Respuesta

66

Puede utilizar la función de 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'))); 

Ten en cuenta que +1 month no siempre se calcula de manera intuitiva. Parece que siempre agrega la cantidad de días que existen en el mes actual.

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) 

Algunos otros intervalos de fecha/hora que se pueden utilizar:

$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))); 
+0

Gracias por esto, no tenía idea de que PHP era lo suficientemente astuto como para convertir '+1 mes' en un tiempo. Supongo que PHP funciona +1 mes desde la hora actual (obviamente)? – Bojangles

+1

Eso es correcto. Tener una obra de teatro, también acepta cosas como "el jueves siguiente", "martes pasado" y "+1 semana 3 días 2 horas 4 segundos" – Gazler

+7

@JamWaffles y @SzamDev, debes verificar que estés satisfecho con el resultado cuando el la fecha actual es el 31 de enero. La aritmética de fechas con meses a veces da resultados inesperados. –

1

Puede utilizar strtotime() como en el ejemplo de Gazler, que es ideal para este caso.

Si necesita un control más complicado, use mktime().

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

¿No será esto más bien lento? Todas esas funciones 'date()'? – Bojangles

+0

Esos son los valores predeterminados para la función, a modo de ilustración. Podrías usar una sola 'fecha()', dividirla y lanzarla. Lo que volverá más rápido es difícil de decir. 'strtotime()', la alternativa, está lejos de ser tan rápido como cabría esperar. – Orbling

17

No necesita funciones de PHP para lograr esto. Ya se puede hacer manipulaciones simples fecha directamente en SQL, por ejemplo:

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

Consulte http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_addtime

+0

Iba a publicar una respuesta similar a esta, pero no recuerdo cómo hacerlo, gracias por publicar la solución. +1 – Bojangles

13

Tenga cuidado, porque a veces puede saltar strtotime("+1 months") número del mes.

Ejemplo:

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

Si hoy es el próximo mes de febrero, que debe haber tiene 28 o 29 días, pero PHP volverá marzo como el mes que viene, no mes de febrero.

+0

Tiene razón, no funciona todo el tiempo porque no funciona con el mes, pero sí con los días. –

+0

¿Podría proponer una solución? – Coco

15

La respuesta aceptada solo funciona si desea exactamente 31 días después. Eso significa que si está usando la fecha "2013-05-31" que espera no estar en junio, que no es lo que yo quería.

Si quiere tener el próximo mes, le sugiero que use el año y el mes actual, pero continúe usando el primero.

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

De esta manera, podrá obtener el mes y el año del mes siguiente sin tener un mes omitido.

+0

Sí, gracias a @Patrick, hice una edición de la respuesta aceptada para notar la manera confusa que a veces hace los cálculos. –

+0

Gracias. Esto es muy inteligente. –

0

Esta función devuelve número correcto positiva o negativamente.Se encuentra en el 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; 
} 
0

01-febrero-2014

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

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

Si desea una fecha específica en el próximo mes, usted puede hacer esto:

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

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

Tenga en cuenta que esta realidad funciona de manera más confiable donde +1 month puede ser confuso. Por ejemplo ...

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 
+0

Esta es una respuesta tan importante. Me pareció extraño que mi código del 31 de mayo viniera con julio desde un comando de +1 mes. ¡Esto lo explicaría! –

0
date("Y-m-d",strtotime("last day of +1 month",strtotime($anydate))) 
+1

Si bien este código puede responder la pregunta, sería mejor explicar cómo resuelve el problema sin introducir otros y por qué usarlo. Las respuestas de solo código no son útiles a largo plazo. – JAL

0

creo que esto es similar a la respuesta de Kouton, pero éste sólo se necesita en una marca de tiempo y devuelve una marca de tiempo en algún lugar del próximo mes. Puede usar date ("m", $ nextMonthDateN) desde allí.

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