2010-08-03 17 views
10

Dando una fecha de inicio, estoy agregando cuatro veces siete días para obtener 5 fechas diferentes separadas exactamente una semana cada una.Agregando días a una marca de tiempo

//$date = '28-10-2010'; 
$timestamp = mktime(0, 0, 0, 10, 01, 2010); 
echo "Date=".date('d-m-Y', $timestamp)."<br>"; 

$timestamp += (60*60*24*7); 
echo "Date=".date('d-m-Y', $timestamp)."<br>"; 

$timestamp += (60*60*24*7); 
echo "Date=".date('d-m-Y', $timestamp)."<br>"; 

$timestamp += (60*60*24*7); 
echo "Date=".date('d-m-Y', $timestamp)."<br>"; 

$timestamp += (60*60*24*7); 
echo "Date=".date('d-m-Y', $timestamp)."<br>"; 

Las salidas de código de esto:

Date=01-10-2010 Friday 
Date=08-10-2010 Friday 
Date=15-10-2010 Friday 
Date=22-10-2010 Friday 
Date=29-10-2010 Friday 

¿Qué tanto tiempo como yo sé que es correcta. Pero, vea lo que sucede cuando pasa por el 2010-10-31 y 2010-11-01

$ timestamp = mktime (0, 0, 0, 10, 28, 2010); [...]

Curiosamente Muestra esto:

Date=28-10-2010 Thursday 
Date=03-11-2010 Wednesday 
Date=10-11-2010 Wednesday 
Date=17-11-2010 Wednesday 
Date=24-11-2010 Wednesday 

¿Qué está pasando? La segunda fecha debe ser 04-11-2010! ¡También, vi que este "error" ocurre cada diez años! ¿Esto está relacionado con el horario de verano? Si es así, ¿cómo lo resuelvo? ¿Hay algo que esté pasando por alto?

Editar: Ok, outputed el momento, sólo para ver lo que sucede y esto es lo que tengo ahora:

Date=28-10-2010 Thursday :: 00:00:00 
Date=03-11-2010 Wednesday :: 23:00:00 
Date=10-11-2010 Wednesday :: 23:00:00 
Date=17-11-2010 Wednesday :: 23:00:00 
Date=24-11-2010 Wednesday :: 23:00:00 

parece algo relacionado con el tiempo, algo que sucede en 31/11/2010 ...

Respuesta

36

Nunca uso de matemáticas como 60 * 60 * 24 * 7 para agregar/día restar (por falta de tiempo horario de verano), utilice strtotime o mktime lugar:

$timestamp = strtotime('+7 days', $timestamp); 

// Or something like this (it's OK to have day parameter <= 0 or > 31) 
$timestamp = mktime(0, 0, 0, $month, $day + 7, $year); 

Su ejemplo será más evidente si que el tiempo voy de salida, así:

$timestamp = mktime(0, 0, 0, 10, 28, 2010); 
echo date('Y-m-d H:i:s', $timestamp) . "\n"; 

$timestamp += 60*60*24*7; 
echo date('Y-m-d H:i:s', $timestamp) . "\n"; 

salida:

2010-10-28 00:00:00 
2010-11-03 23:00:00 

Aquí tienen 2010-11-03 23:00:00 en lugar de 2010-11-04 00:00:00 porque uno de los días (31 de octubre) es hora larga en lugar de 24.

0

que han tenido un gran éxito con esta metodología para la adición de días, aunque no lo he probado con el formato:

$date = The value of the database from your query 
$daysahead = The number of days ahead you want to calculate 
$final_date = date(“m/d/Y”, strtotime($date) + (86400 * $daysahead)); 

echo $final_date; 
2

Parece que se movió al ahorro de horario de verano o de regreso de ellos.

La hora POSIX (indicación de fecha y hora) siempre es UTC mientras que la hora local es UTC + X donde X puede cambiar de fecha a fecha de acuerdo con el ahorro de tiempo.

1

Creo que esto tiene algo que ver con el horario de verano porque el segmento 'tiempo' de su marca de tiempo se establece en medianoche, pero cuando termina el horario de verano retrocedemos una hora, que sigue siendo el día anterior (a las 11 pm).

Si agregar 2 horas a la línea original por lo que tiene esto:

$timestamp = mktime(2, 0, 0, 10, 01, 2010); 

y por lo tanto empezar a las 2 am en lugar de la media noche ... funciona.

+0

¿Su solución funcionará en todo el mundo? –

2

Realmente parece estar relacionado zona horaria/DST.

Adición

date_default_timezone_set('UTC'); 

como la primera línea resuelve el problema (como que ya no usa ningún ajuste DST).

+0

Esto también funcionó. –

1

Nunca entenderé por qué las personas usan esta horrible función mktime.

En caso de estar en PHP5.3 sin embargo, es posible que desee considerar el uso de

$period = new DatePeriod(
    new DateTime('28-10-2010'), 
    DateInterval::createFromDateString('1 week'), 
    4); 

foreach ($period as $dt) { 
    echo $dt->format("l Y-m-d H:i:s\n"); 
} 

Sin PHP5.3 aún puede utilizar

for($i=0; $i<=4; $i++) { 
    echo date('Y-m-d', strtotime("+$i weeks 28-10-2010")), PHP_EOL; 
} 

preguntas DateTime son pretty common on SO, so you might find interesting cases when searching.

0

En caso de que alguien lo necesite, igual que yo, haciendo referencia al sitio: Hoy, hora actual, Y-m-d H: i: s, más +7 días. O puede agregar +3 meses, etc.

$timestamp=strtotime("+7 Days"); 
$nowtime = date('Y-m-d H:i:s', $timestamp); 
Cuestiones relacionadas