2009-02-02 24 views
15

Creo que es posible, pero no puedo encontrar el algoritmo correcto para ello.cómo obtener la fecha de la semana pasada (martes o cualquier otro día) en php?

lo que quería hacer era:

Si hoy es lunes 2 Feb de 2009, ¿Cómo podría saber la fecha del martes de la semana pasada? Usando ese mismo código 2 días después, encontraría la misma fecha del martes de la semana pasada con la fecha actual que está siendo cerrado miércoles, Feb 4 2009.

Respuesta

17

Sé que ya hay una respuesta aceptada, pero no cumple con el segundo requisito que se solicitó. En el caso anterior, strtotime arrojaría ayer si se usa un miércoles. Por lo tanto, sólo para ser exactos a pesar de ello hay que comprobar esto:

$tuesday = strtotime('last Tuesday'); 
// check if we need to go back in time one more week 
$tuesday = date('W', $tuesday)==date('W') ? $tuesday-7*86400 : $tuesday; 

Como davil señaló en su comentario, esto era una especie de tiro rápido de la mía. El cálculo anterior se cancelará una vez al año debido al horario de verano. La solución suficientemente buena sería:

$tuesday = date('W', $tuesday)==date('W') ? $tuesday-7*86400+7200 : $tuesday; 

Si necesita el tiempo para ser 0: 00h, tendrá un cierto esfuerzo adicional por supuesto.

+2

Esto no funcionará 1 semana por año cuando el domingo solo tiene 23 horas debido a la conmutación DST (la marca de tiempo resultante se ser para el lunes 23:00). Reemplace "7 * 86400" por "7 * 86400 + 7200". Por supuesto, en ese caso, el tiempo no siempre será 0:00, ¡pero la fecha será DST segura! – davil

+0

Tienes razón, esta fue una especie de instantánea. Gracias por señalar eso! –

+0

gracias por eso, no me di cuenta hasta hoy (es miércoles) T_T Te debo más ahora jeje – lock

13

PHP realmente lo hace muy fácil:

echo strtotime('last Tuesday'); 

Véase el strtotime documentación.

+0

TT Por qué no he visto que en el TT documentación muchas gracias te debo – lock

+1

esto en realidad no le da "Martes de la semana pasada", pero la última martes (que puede ser la misma semana ... si es viernes) – garyee

+0

Exactamente @garyee - verifique mi respuesta debajo de – smo0f

0

has olvidado strtotime para el segundo argumento de la fecha ('W', $ martes) hmm.

convertido $ martes a marca de tiempo antes de "$ Martes-7 * 86400 + 7200"

MDE.

3

Solución de trabajo:

$z = date("Y-m-d", strtotime("last Saturday")); 
$z = (date('W', strtotime($z)) == date('W')) ? (strtotime($z)-7*86400+7200) : strtotime($z); 
print date("Y-m-d", $z); 
1
// test: find last date for each day of the week 
foreach (array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') as $day) { 
    print $day . " => " . date('m/d/Y', last_dayofweek($day)) . "\n"; 
} 

function last_dayofweek($day) 
{ 
    // return timestamp of last Monday...Friday 
    // will return today if today is the requested weekday 
    $day = strtolower(substr($day, 0, 3)); 
    if (strtolower(date('D')) == $day) 
     return strtotime("today"); 
    else 
     return strtotime("last {$day}"); 
} 
0
<?php 
    $currentDay = date('D'); 
    echo "Today-".$today = date("Y-m-d"); 
    echo "Yesterday-".$yesterday = date("Y-m-d",strtotime('yesterday')); 
    echo "Same day last week-".$same_day_last_week = date("Y-m-d",strtotime('last '.$currentDay)); 
?> 
13

La mayoría de estas respuestas son o bien demasiado, o técnicamente incorrecta porque "el martes pasado" no significa necesariamente el martes de la semana pasada, sólo significa el martes anterior, que podría ser dentro de la misma semana de "ahora".

La respuesta correcta es:

strtotime('tuesday last week') 
+2

Esta debería ser la respuesta aceptada –

+0

@STTLCU Sí, no sé por qué la más votada se considera correcta, si si la ejecutas un miércoles, básicamente volverá el martes de ayer, no el último semana, que no es lo que OP está pidiendo – smo0f

+1

Estoy de acuerdo con @STT LCU. Esta debería ser la respuesta aceptada ya que me encontré con el mismo problema que estaba usando 'el último lunes' que recogió ayer – AdRock

Cuestiones relacionadas