2009-09-16 16 views
19

Come posso ottenere la data per lunedì e venerdì per la settimana corrente?Ottieni data per lunedì e venerdì per la settimana corrente (PHP)

Ho il seguente codice, ma non riesce se il giorno corrente è domenica o sabato.

$current_day = date("N"); 
$days_to_friday = 5 - $current_day; 
$days_from_monday = $current_day - 1; 
$monday = date("Y-m-d", strtotime("- {$days_from_monday} Days")); 
$friday = date("Y-m-d", strtotime("+ {$days_to_friday} Days")); 
+2

Stai contando Domenica come l'inizio o la fine della settimana? – Greg

+0

Come la fine della settimana. – Psyche

risposta

52

Questi ingressi strtotime funzionano molto bene:

strtotime("next monday"); 
strtotime("previous monday"); 
strtotime("today"); 
strtotime("next friday"); 
strtotime("previous friday"); 

Tutto quello che dovete fare è quello di avvolgere la logica all'interno di alcune istruzioni if.

+1

nice an ma cosa voglio ottenere il lunedì dalla data. come 01-01-2012 restituirà 2-01-2012 – chhameed

+7

@chhameed: 'strtotime (" next lunedi ", strtotime (" 2012-01-01 "))'. Il secondo parametro, se specificato, viene utilizzato come data di riferimento. –

+1

Ooh grazie mille ... mi ha davvero aiutato ..... – chhameed

1

Questo in realtà dipende da come si definisce una settimana ma mi si avvicinò con questa funzione che vi darà la data per il "lunedi" più vicino o "venerdì" (o qualsiasi giorno per questo):

function closestDate($day){ 

    $day = ucfirst($day); 
    if(date('l', time()) == $day) 
     return date("Y-m-d", time()); 
    else if(abs(time()-strtotime('next '.$day)) < abs(time()-strtotime('last '.$day))) 
     return date("Y-m-d", strtotime('next '.$day)); 
    else 
     return date("Y-m-d", strtotime('last '.$day)); 

} 

Input: un giorno della settimana ("domenica", "Lunedi", etc.)

uscita: Se ho chiesto la "domenica" più vicino e oggi è:

  1. "Domenica ": Io w ill ottenere la data odierna
  2. "Lunedi": mi metterò la data di ieri
  3. "Sabato: mi metterò la data di domani

Spero che questo aiuti :)

9

Questa domanda ha bisogno di una risposta DateTime: -

/** 
* @param String $day 
* @return DateTime 
*/ 
function getDay($day) 
{ 
    $days = ['Monday' => 1, 'Tuesday' => 2, 'Wednesday' => 3, 'Thursday' => 4, 'Friday' => 5, 'Saturday' => 6, 'Sunday' => 7]; 

    $today = new \DateTime(); 
    $today->setISODate((int)$today->format('o'), (int)$today->format('W'), $days[ucfirst($day)]); 
    return $today; 
} 

Usage:

var_dump(getDay('Monday')->format('l dS F Y')); 
var_dump(getDay('Friday')->format('l dS F Y')); 

uscita:

string 'Monday 30th September 2013' (length=26) 
string 'Friday 04th October 2013' (length=24) 

See it working

0

avevo bisogno di una definizione della settimana corrente a norma ISO 8601. Voglio Lunedi da sempre definito come il Lunedi che ha iniziato questa settimana corrente.

la seguente soluzione funziona eccellente per me:

$monday = strtotime(date('o-\WW')); 
$friday = strtotime("next friday",$monday); 

Per $monday, questo metodo restituisce sempre il Lunedi che ha iniziato questa settimana di calendario. sfortunatamente, questo metodo si basa su PHP 5.1 per analizzare il formato di data o.

di ottenere qualsiasi giorno della settimana, si potrebbe provare:

function time_for_week_day($day_name, $ref_time=null){ 
    $monday = strtotime(date('o-\WW',$ref_time)); 
    if(substr(strtoupper($day_name),0,3) === "MON") 
     return $monday; 
    else 
     return strtotime("next $day_name",$monday); 
} 

Usage:

time_for_week_day('wednesday'); 
time_for_week_day('friday',strtotime('2014-12-25')); 
0

Come la risposta superiore suggerisce, utilizzando la funzione di PHP strtotime() è il modo più semplice.

Tuttavia, invece di utilizzare le istruzioni come suggerisce, è sufficiente ripristinare la domenica precedente e prendere le date necessarie da lì.

$monday = strtotime('next monday', strtotime('previous sunday')); 
$friday = strtotime('next friday', strtotime('previous sunday')); 
0

Stavo cercando una cosa simile, tranne che volevo un lunedì, non solo questa settimana. Questo è quello che mi è venuto in mente:

function getSunday(DateTime $date){ 
    $outdate = clone($date); 
    $day = $date->format("w"); // get the weekday (sunday is 0) 
    $outdate->sub(new DateInterval("P".$day."D")); // subtracting the weekday from the date always gives Sunday 
    return $outdate; 
} 

Accetta una data arbitraria e dà la domenica. Quindi puoi facilmente aggiungere giorni indietro per arrivare dal lunedì al sabato.

33

migliore soluzione potrebbe essere:

$monday = date('Y-m-d', strtotime('monday this week')); 
$friday = date('Y-m-d', strtotime('friday this week')); 
+0

Questo è fantastico. Grazie. Il lavoro è breve e leggibile –

+0

Questo è molto meglio della risposta accettata. Non c'è differenza tra "questo venerdì" e "venerdì prossimo". Devi usare "venerdì questa settimana" e "venerdì prossima settimana" – DrDamnit

0

che uso:

$first_week_date = date('d F Y', strtotime('next Monday -1 week', strtotime('this sunday'))); 
$last_week_date = date('d F Y', strtotime('next Monday -1 week + 4 days', strtotime('this sunday'))); 
Problemi correlati