2010-05-20 22 views
67

Digamos que tengo una cita con el siguiente formato: 2010-12-11 (año-mon-día)la fecha de la subasta en un mes

Con PHP, quiero incrementar la fecha en un mes, y yo desea que el año se incremente automáticamente, si es necesario (es decir, incrementándose de diciembre de 2012 a enero de 2013).

Atentamente.

Respuesta

110
$time = strtotime("2010.12.11"); 
$final = date("Y-m-d", strtotime("+1 month", $time)); 

// Finally you will have the date you're looking for. 
+19

No funciona con todas las fechas. Por ejemplo, 2013-05-31 mostrará julio en lugar del mes siguiente, que es junio. –

+1

Me estoy siguiendo, 2014-03-03 para 2014-01-31 razón? –

+0

No funcionó con esta cadena: "2014-06-19 15:00:19" –

20

Use DateTime::add.

$start = new DateTime("2010-12-11", new DateTimeZone("UTC")); 
$month_later = clone $start; 
$month_later->add(new DateInterval("P1M")); 

que utilizan clone porque complemento modifica el objeto original, lo que no sería de desear.

+0

Esto funciona, pero agregaría el método de devolución. –

9
strtotime("+1 month", strtotime($time)); 

esto devuelve una marca de tiempo que se puede utilizar con la función de la fecha

+0

@Gelen: esto no funciona, da fecha incorrecta .... por favor, dígale cómo usar su método, ¿cuál es el valor de $ tiempo aquí? – sqlchild

+0

esto no funciona, da fecha incorrecta ... por favor, indique cómo usar su método, ¿cuál es el valor de $ tiempo aquí? – sqlchild

+0

Mismo problema que la respuesta aceptada. No funciona en todas las cadenas. –

27

que necesitaba una funcionalidad similar, a excepción de un ciclo mensual (más meses, menos 1 día). Después de buscar S.O. por un tiempo, yo era capaz de elaborar esta solución plug-n-play:

function add_months($months, DateTime $dateObject) 
    { 
     $next = new DateTime($dateObject->format('Y-m-d')); 
     $next->modify('last day of +'.$months.' month'); 

     if($dateObject->format('d') > $next->format('d')) { 
      return $dateObject->diff($next); 
     } else { 
      return new DateInterval('P'.$months.'M'); 
     } 
    } 

function endCycle($d1, $months) 
    { 
     $date = new DateTime($d1); 

     // call second function to add the months 
     $newDate = $date->add(add_months($months, $date)); 

     // goes back 1 day from date, remove if you want same day of month 
     $newDate->sub(new DateInterval('P1D')); 

     //formats final date to Y-m-d form 
     $dateReturned = $newDate->format('Y-m-d'); 

     return $dateReturned; 
    } 

Ejemplo:

$startDate = '2014-06-03'; // select date in Y-m-d format 
$nMonths = 1; // choose how many months you want to move ahead 
$final = endCycle($startDate, $nMonths); // output: 2014-07-02 
+1

Excelente, justo lo que necesitaba. Gracias por ahorrarme mucho tiempo! – Tumtum

+0

No hay problema, me alegro de que lo haya encontrado útil – Jason

+0

Gracias Jason, esto fue muy útil. Lo reformaté y agregué más comentarios para ayudarme a entenderlo todo. En caso de que eso ayude a alguien, lo publiqué más abajo (intenté agregarlo aquí pero fue demasiado largo). – ScreenWatcher

4
(date('d') > 28) ? date("mdY", strtotime("last day of next month")) : date("mdY", strtotime("+1 month")); 

Esto compensará febrero y el otro día mes 31. Por supuesto, puede hacer muchas más comprobaciones para ser más exactos para 'este día del próximo mes' relative date formats (lo que no funciona tristemente, vea más abajo), y también podría usar DateTime.

Ambos DateInterval('P1M') y strtotime("+1 month") son prácticamente ciegos añadiendo 31 días, independientemente de la cantidad de días del mes siguiente.

  • 2010-01-31 => Marzo 3 ª
  • 2012-01-31 => 2a marzo (año bisiesto)
+0

"agregar ciegamente 31 días independientemente de la cantidad de días en el mes siguiente", ¡absolutamente correcto! (+1) –

4

utilizo esta manera: -

$occDate='2014-01-28'; 
$forOdNextMonth= date('m', strtotime("+1 month", strtotime($occDate))); 
//Output:- $forOdNextMonth=02 


/*****************more example****************/ 
$occDate='2014-12-28'; 

$forOdNextMonth= date('m', strtotime("+1 month", strtotime($occDate))); 
//Output:- $forOdNextMonth=01 

//***********************wrong way**********************************// 
$forOdNextMonth= date('m', strtotime("+1 month", $occDate)); 
    //Output:- $forOdNextMonth=02; //instead of $forOdNextMonth=01; 
//******************************************************************// 
+1

me funciona gracias. Pero la fecha ('m', strtotime ("+ 1 mes", strtotime ($ occDate))) y la fecha ('m', strtotime ("+ 1 mes", $ occDate)) funcionan igual. –

+1

No, ambos son difference @ sah.cyBuzzSc. Considere el ejemplo: - $ occDate = '2014-12-28'; $ forOdNextMonth = date ('m', strtotime ("+ 1 mes", $ occDate)); El valor $ forOdNextMonth es 02. – vineet

+0

gracias por explicar @chotesah. Tu segundo ejemplo es bastante bueno. –

0

Gracias, Jason, tu publicación fue muy útil. Lo reformaté y agregué más comentarios para ayudarme a entenderlo todo.En caso de que ayuda a nadie, he publicado aquí:

function cycle_end_date($cycle_start_date, $months) { 
    $cycle_start_date_object = new DateTime($cycle_start_date); 

    //Find the date interval that we will need to add to the start date 
    $date_interval = find_date_interval($months, $cycle_start_date_object); 

    //Add this date interval to the current date (the DateTime class handles remaining complexity like year-ends) 
    $cycle_end_date_object = $cycle_start_date_object->add($date_interval); 

    //Subtract (sub) 1 day from date 
    $cycle_end_date_object->sub(new DateInterval('P1D')); 

    //Format final date to Y-m-d 
    $cycle_end_date = $cycle_end_date_object->format('Y-m-d'); 

    return $cycle_end_date; 
} 

//Find the date interval we need to add to start date to get end date 
function find_date_interval($n_months, DateTime $cycle_start_date_object) { 
    //Create new datetime object identical to inputted one 
    $date_of_last_day_next_month = new DateTime($cycle_start_date_object->format('Y-m-d')); 

    //And modify it so it is the date of the last day of the next month 
    $date_of_last_day_next_month->modify('last day of +'.$n_months.' month'); 

    //If the day of inputted date (e.g. 31) is greater than last day of next month (e.g. 28) 
    if($cycle_start_date_object->format('d') > $date_of_last_day_next_month->format('d')) { 
     //Return a DateInterval object equal to the number of days difference 
     return $cycle_start_date_object->diff($date_of_last_day_next_month); 
    //Otherwise the date is easy and we can just add a month to it 
    } else { 
     //Return a DateInterval object equal to a period (P) of 1 month (M) 
     return new DateInterval('P'.$n_months.'M'); 
    } 
} 

$cycle_start_date = '2014-01-31'; // select date in Y-m-d format 
$n_months = 1; // choose how many months you want to move ahead 
$cycle_end_date = cycle_end_date($cycle_start_date, $n_months); // output: 2014-07-02 
2

Por favor, primero se establece el formato de fecha que como 12-12-2012

Después de usar esta función es un trabajo adecuadamente;

$date = date('d-m-Y',strtotime("12-12-2012 +2 Months"); 

Aquí 12-12-2012 es su fecha y +2 meses es el incremento del mes;

También aumentan los años, Fecha

strtotime("12-12-2012 +1 Year"); 

Ans es 12-12-2013

0
function dayOfWeek($date){ 
    return DateTime::createFromFormat('Y-m-d', $date)->format('N'); 
} 

ejemplos de uso:

echo dayOfWeek(2016-12-22); 
// "4" 
echo dayOfWeek(date('Y-m-d')); 
// "4" 
0
$date = strtotime("2017-12-11"); 
$newDate = date("Y-m-d", strtotime("+1 month", $date)); 

Si quieres incrementar por días también puede hacerlo

$date = strtotime("2017-12-11"); 
$newDate = date("Y-m-d", strtotime("+5 day", $date)); 
0

Para cualquier persona que busque una respuesta a cualquier formato de fecha.

echo date_create_from_format('d/m/Y', '15/04/2017')->add(new DateInterval('P1M'))->format('d/m/Y'); 

Simplemente cambie el formato de fecha.

-1

poner una fecha en el cuadro de entrada y haga clic en el botón obtener días desde la fecha en jquery

$(document).ready(function() { 
    $("button").click(function(){ 
    var day = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]; 
    var a = new Date(); 
    $(".result").text(day[a.getDay()]); 

    }); 
      }); 
+0

no funciona – user9401222

Cuestiones relacionadas