2009-08-01 9 views
7
for($x=0; $x<12; $x++) 
{ 
    $month = mktime(0, 0, 0, date("m")+$x, date("d"), date("Y")); 
    $key = date('m', $month); 
    $monthname = date('F', $month); 
    $months[$key] = $monthname; 
} 

Sé con certeza que estoy haciendo los cálculos incorrectamente para el 4º parámetro de mktime. Estoy comenzando con el número del mes actual (7 es julio) y agrego 1 por cada mes, a veces termina siendo el mismo mes dos veces, ¿tal vez porque no lo estoy configurando para el comienzo del mes? ¿Cómo mejorarías/recodificarías esto?PHP: poblar una matriz con los nombres de los próximos 12 meses

El resultado es que $ meses daría como resultado una matriz donde 07 = 08 de julio = agosto, 09 = septiembre. En este momento se completa octubre dos veces. Creo que tiene que ver con que hoy es el 31 y se agrega incorrectamente y llega al mes siguiente.

+0

vuelve a formatear el código. –

Respuesta

24

acaba de arreglar su código un poco, esto debería funcionar bastante bien:

$months = array(); 
$currentMonth = (int)date('m'); 

for ($x = $currentMonth; $x < $currentMonth + 12; $x++) { 
    $months[] = date('F', mktime(0, 0, 0, $x, 1)); 
} 

Tenga en cuenta que Saqué la clave de la matriz, ya que creo que es innecesario, pero se puede cambiar eso, por supuesto, si lo necesita.

1

Dado 2592000 es 30 días.

$month_time = 60*60*24*30; // 30 Days 
for($x=0; x<12; $x++) 
{ 
    $time = time()+($month_time*$x); 
    $key = date('m', $time); 
    $month[$key] = date('F', $time); 
} 

En una respuesta en StackOverflow, no lo encuentra en este momento, alguien comparó el rendimiento de varios métodos de creación de una semana de tiempo 1 a partir de ahora. Usar números directamente era mucho más eficiente que cualquier otro método.

+0

Su forma parece mostrar el mismo mes dos veces, si comienzo el 1 de enero, entonces 30 días todavía serían enero. Puede ser mejor ir 32 días a la vez, entonces el único problema comienza a finales de enero, ya que puede omitir el feb –

+0

¿cómo lo haría? ¿sería más preciso pero menos eficiente usando strtotime? –

+0

"El rendimiento de crear un momento en una semana a partir de ahora" está muy bien, con meses debes tener en cuenta algunos detalles más. :) – deceze

5

Una alternativa sería utilizar strtotime:

for ($x=0; $x < 12; $x++) { 

    $time = strtotime('+' . $x . ' months', strtotime(date('Y-M' . '-01'))); 
    $key = date('m', $time); 
    $name = date('F', $time); 
    $months[$key] = $name; 
} 

En mi opinión, este código es más fácil de leer.

+0

'echo date ('Y-m-d', strtotime (" + 1 mes ", strtotime ('2009-01-31')));' produce "2009-03-03". Tendrá que restablecer al menos la fecha de inicio al primer día del mes antes de poder usar la suma relativa de tiempo. – deceze

+0

Hmm. No sabia esto Entonces el código debería ser: for ($ x = 0; $ x <12; $ x ++) { $ time = strtotime ('+'. $ X. 'Months', strtotime (date ('YM'). '-01'))); $ clave = fecha ('m', $ time); $ name = date ('F', $ time); $ months [$ key] = $ name; } en su lugar. – kbeyer

+0

Funcionó muy bien, acepto que también es más fácil de leer. – SamV

1

Usted puede ser que consiga el último día del mes (31) error - que dio lugar a dos meses con el mismo enlace - que Eddy muy bien averiguado por mí con este answer:

$current_month = date('n'); 
$MONTHS = array(); 
for ($m=0; $m<12; $m++) { 
    $display_month = $m + $current_month; 
    $MONTHS[] = date('F',mktime(1,1,1,$display_month,1,date("Y"))); 
0

" El resultado es que $ meses daría como resultado una matriz donde 07 = 08 de julio = agosto, 09 = septiembre ".

for ($key = 1; $key <=12; $key++) { 
    $months[str_pad($key, 2, '0', STR_PAD_LEFT)] = date('F', strtotime('2000-' . $key)); 
} 

Si estás bien con 7 = 8 de julio de = agosto 9 = septiembre a continuación:

for ($key = 1; $key <=12; $key++) { 
    $months[$key] = date('F', strtotime('2000-' . $key)); 
} 
3

menos complicado, no hay bucles, genéricos claves de matriz:

function stackoverflow_get_monthname($x){ 
    return date("F",mktime(NULL, NULL, NULL, (int)date("n") + ($x+1), NULL, NULL)); 
} 
$months = array_map("stackoverflow_get_monthname", range(1,12)); 
var_dump($months); 
0

En algún momento debe tener cuidado con su configuración regional, por lo que esta es mi solución (en una función):

$months = []; 

for ($x=1; $x < 13; $x++) { 

    $time = mktime(0, 0, 0, $x, 1); 
    $key = date('m', $time); 
    $name = ucfirst(strftime('%B', $time)); 
    $months[(int)$key] = $name; 
} 

return $months; 
0

Aquí hay una secuencia de comandos simple para avanzar 12 meses a partir de la fecha actual. Incluye el año con eso.

# Set Number of Months to Traverse 
$num_months = 12; 

# Set Current Month as the 1st 
$current_month = date('Y-m').'-01'; 

for ($count = 0; $count <= $num_months; $count++) { 
    # Fetch Date for each as YYYY-MM-01 
    $dates[] = date('Y-m', strtotime($current_month.' + '.$count.' Months')).'-01'; 
} 

Se podría convertir esto en una lista de selección con el mes actual seleccionada por dejar caer esto en:

echo '<select name="month">'; 

foreach ($dates as $d) { 
    echo '<option value="'.$d.'"'; 
    if ($d == date('Y-m').'-01') echo 'selected="selected"'; 
    echo '>'.date('F, Y', strtotime($d)).'</option>'; 
} 

echo '</select>'; 
Cuestiones relacionadas