2012-06-13 15 views
6

Estoy intentando muchos enfoques pero luego me quedo a medio camino.PHP. ¿Cómo obtener un evento bimensual recurrente?

Digamos que la orden fue creada hoy. Necesito mostrar cuándo ocurrirá la próxima orden recurrente. Así que tengo el pedido creado el 13 de junio de 2012. Luego he establecido el calendario en orden recurrente bimestral, cada 1er mes. ¿Cómo calcular cuándo se producirá la próxima orden recurrente? La respuesta es el 1 de agosto.

Si alguien puede delinear un enfoque, sería muy útil, no tiene que ser código. Esto es lo que tengo hasta ahora ...

// first, get starting date 
    $start_date_month = date('m', strtotime($start_date)); 

    // get this year 
    $this_year = date('Y'); 

    // if this month is december, next month is january 
    $this_month = date('m', $timestamp_month); 
    if($this_month == 12){ 
     $next_month = 1; 
    // if this month is not december add 1 to get next month 
    }else{ 
     $next_month = $this_month + 1; 
    } 

    // get array of months where recurring orders will happen 
    $months = array(); 
    for ($i=1; $i<=6; $i++) { 
     $add_month = $start_date_month+(2*$i); // 2, 4, 6, 8, 10, 12 
     if($add_month == 13){$add_month = 1;$year = $this_year+1;} 
     elseif($add_month == 14){$add_month = 2;$year = $this_year+1;} 
     elseif($add_month == 15){$add_month = 3;$year = $this_year+1;} 
     elseif($add_month == 16){$add_month = 4;$year = $this_year+1;} 
     elseif($add_month == 17){$add_month = 5;$year = $this_year+1;} 
     elseif($add_month == 18){$add_month = 6;$year = $this_year+1;} 
     elseif($add_month == 19){$add_month = 7;$year = $this_year+1;} 
     elseif($add_month == 20){$add_month = 8;$year = $this_year+1;} 
     else{$year = $this_year;} 
     echo $what_day.'-'.$add_month.'-'.$year.'<br />'; 
     $months[] = $add_month; 
    } 

    echo '<pre>'; 
    print_r($months); 
    echo '</pre>'; 

no quiero simplemente encontrar lo que es la fecha en dos meses a partir de ahora. Digamos orden creado el 1 de junio. El próximo pedido recurrente es el 1 de agosto. Entonces digamos ahora, hoy es el 1 de septiembre, pero el próximo pedido recurrente es el 1 de octubre. Ver mi dilema?

+0

¿Desea ** solo ** la próxima fecha recurrente a partir de hoy, o todas las fechas recurrentes desde la creación hasta la siguiente inclusive desde hoy? – salathe

+0

No veo tu dilema. ¿Por qué importa el 1 de septiembre? ¿Cómo se relaciona con el problema de orden recurrente? – afuzzyllama

+0

Porque si el pedido se creó hoy el 13 de junio, es fácil obtener el siguiente pedido recurrente. También es fácil crear una variedad de las siguientes 6 órdenes recurrentes. Ahora, si hoy fuera el 1 de septiembre, ¿cómo se calcula la próxima orden recurrente? Todo lo que se debe calcular es UNA fecha, solo el siguiente orden recurrente. – leonel

Respuesta

5

Simplemente tome el mes actual, por lo que desde junio, obtenemos 6. 6 mod 2 == 0. El próximo mes es julio, obtenemos 7. 7 mod 2 == 1.

Así que solo verifique si current month % 2 == (first month % 2).

Luego solo verifique si es el 1 ° del mes.

En el módulo de PHP se define con el símbolo de porcentaje.

$month = date('n'); 
$createdMonth = 6; 
if($month % 2 == $createdMonth % 2){ 
    // stuff 
} 
+0

es Bimestral, cada dos meses – leonel

+0

Exactamente, este método funcionaría. Si comenzó en junio (6), omitirá julio y luego agosto (8) volverá a suceder el evento. (6% 2) == (8% 2) –

+0

Y si comenzases en julio (7), volvería a ocurrir en septiembre porque '9% 2' y' 7% 2' son iguales, pero sería omita el mes de agosto ya que '8% 2' no es igual a' 7% 2' –

2

Tengo esto:

$today = new DateTime(); 
$target_date = $today->modify("first day of +2 months"); 

echo "Your event is on " . $target_date->format("d/m/Y") . "!"; 
2

strtotime al rescate:

<?php 
date_default_timezone_set('Europe/London'); 
$d = new DateTime('2012-01-31'); 
$d->modify('first day of +2 months'); 
echo $d->format('r'), "\n"; 
?> 
2

Digamos que usted desea que los próximos seis órdenes:

$order_date = '6/13/2012'; 
$start  = date('Y-m-01', strtotime($order_date)); 

$order_count = 6; 

$future_orders = array(); 

$next = strtotime('+2 months', strtotime($start)); 
while(count($future_orders) < $order_count){ 
    $future_orders[] = date('m/d/Y',$next); 
    $next = strtotime('+2 months', $next); 
} 

Esto puede, obviamente, , ser mejorado, pero debería comenzar. ..

4

Puede encontrar la biblioteca llamada When útil para esto (soy el autor).

Aquí es el código que le llevará al siguiente 2 recurrentes fechas mensuales (desde la fecha del día de hoy):

include 'When.php'; 

$r = new When(); 
$r->recur(new DateTime(), 'monthly') 
    ->count(2) 
    ->interval(2) // every other month 
    ->bymonthday(array(1)); 

while($result = $r->next()) 
{ 
    echo $result->format('c') . '<br />'; 
} 

// output 
// 2012-08-01T13:33:33-04:00 
// 2012-10-01T13:33:33-04:00 

Teniendo esto un paso más allá, es probable que sólo quieren encontrar los 2 primeros días hábiles:

include 'When.php'; 

$r = new When(); 
$r->recur(new DateTime(), 'monthly') 
    ->count(2) 
    ->interval(2)         // every other month 
    ->byday(array('MO', 'TU', 'WE', 'TH', 'FR')) // week days only 
    ->bymonthday(array(1, 2, 3))     // the first weekday will fall on one of these days 
    ->bysetpos(array(1));       // only return one per month 

while($result = $r->next()) 
{ 
    echo $result->format('c') . '<br />'; 
} 

// output 
// 2012-08-01T13:33:33-04:00 
// 2012-10-01T13:33:33-04:00 

También tenga en cuenta que el código se encuentra actualmente en una reescritura, funciona bien pero es un poco confuso y no está bien documentado.

Cuestiones relacionadas