2009-02-02 15 views
15

Penso sia possibile ma non riesco a trovare il giusto algoritmo per questo.come ottenere la data della scorsa settimana (martedì o qualsiasi altro giorno) in php?

Quello che volevo fare era:

Se oggi è Lunedi 2 Febbraio 2009, come faccio a conoscere la data di martedì della scorsa settimana? Utilizzando lo stesso codice di 2 giorni dopo, vorrei trovare la stessa data della scorsa settimana martedì con la data corrente essendo Mercoledì 4 febbraio 2009.

risposta

17

So che esiste già una risposta accettata, ma secondo me non soddisfa il secondo requisito richiesto. Nel caso sopra riportato, lo strtotime produrrebbe ieri se usato il mercoledì. Così, tanto per essere precisi si sarebbe ancora bisogno di verificare la presenza di questo:

$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; 

Come davil ha sottolineato nel suo commento, questa è stata una specie di rapido colpo di mio. Il calcolo sopra riportato sarà disattivato una volta all'anno a causa dell'ora legale. La soluzione sufficientemente buona sarebbe:

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

Se avete bisogno di tempo per essere 0: 00h, avrete bisogno di qualche sforzo in più, naturalmente.

+2

Questo non funzionerà 1 settimana all'anno quando domenica ha solo 23 ore a causa del passaggio all'ora legale (il timestamp risultante sarà essere per lunedì 23:00). Sostituire "7 * 86400" con "7 * 86400 + 7200". Ovviamente in quel caso l'orario non sarà sempre 0:00, ma la data sarà sicura per l'ora legale! – davil

+0

Hai ragione, questa è stata una specie di colpo rapido. Grazie per la segnalazione! –

+0

grazie per quello, non me ne sono accorto fino ad oggi (il suo mercoledì ora) T_T ti devo ancora adesso hehe – lock

13

PHP rende in realtà questo molto semplice:

echo strtotime('last Tuesday'); 

Vedere le strtotime documentazione.

+0

TT perché non ho visto che nel TT di documentazione grazie mille ti devo – lock

+1

questo in realtà non ti dà "martedì della scorsa settimana", ma l'ultima martedì (che può essere la stessa settimana ... se è venerdì) – garyee

+0

Esattamente @ garyee - controlla la mia risposta sotto – smo0f

0

hai dimenticato lo strtotime per il secondo argomento di data ('W', $ martedì) hmm.

convertito $ martedì al timestamp prima di "$ martedì-7 * 86400 + 7200"

MDE.

3

Soluzione di lavoro:

$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 maggior parte di queste risposte sono o troppo, o tecnicamente corretto perché "Martedì scorso" non significa necessariamente il Martedì della scorsa settimana, è solo significa il martedì precedente, che potrebbe essere all'interno della stessa settimana di "ora".

La risposta corretta è:

strtotime('tuesday last week') 
+2

Questa dovrebbe essere la risposta accettata –

+0

@STTLCU sì, non so perché il più votato è considerato corretto quando se lo esegui un mercoledì sarà sostanzialmente il martedì di ieri, non ultimo settimana, che non è quello che chiede OP – smo0f

+1

Sono d'accordo con LCU @STT. Questa dovrebbe essere la risposta accettata in quanto mi sono imbattuto nello stesso problema che stava usando "lo scorso lunedì" che ha raccolto ieri – AdRock

Problemi correlati