2009-09-16 24 views
19

¿Cómo puedo obtener la fecha de lunes a viernes para la semana actual?Obtener fecha para el lunes y el viernes para la semana actual (PHP)

Tengo el siguiente código, pero falla si el día actual es el domingo o el sábado.

$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

¿Usted está contando el domingo como el inicio o el final de la semana? – Greg

+0

Como el final de la semana. – Psyche

Respuesta

52

Estas entradas strtotime funcionan muy bien:

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

Todo lo que necesita hacer es envolver la lógica dentro de algunas sentencias if.

+1

nice Ans pero qué es lo que quiero obtener el lunes a partir de la fecha. como 01-01-2012 volverá 2-01-2012 – chhameed

+7

@chhameed: 'strtotime (" next lunes ", strtotime (" 2012-01-01 "))'. El segundo parámetro, si se especifica, se usa como fecha de referencia. –

+1

Ooh muchas gracias ... realmente me ayudó ..... – chhameed

1

Esto realmente depende de cómo se defina una semana pero subió con esta función que le dará la fecha para el "Lunes" más cercano o "Viernes" (o cualquier día para esa materia):

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

} 

de entrada: un día de la semana ("Domingo", "Lunes", etc.)

de salida: si pedí la "Domingo" más cercana y en la actualidad es:

  1. "Domingo ": Yo w enfermos obtener la fecha de hoy
  2. "Lunes": voy a tener la fecha de ayer
  3. "Sábado: voy a tener la fecha de mañana

Espero que esto ayude :)

9

Esta pregunta necesita una respuesta Tiempo: -

/** 
* @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; 
} 

Uso:

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

Salida:

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

See it working

0

necesitaba una definición de la semana en curso según ISO 8601. Quiero lunes a siempre ser definido como el lunes que comenzó esta semana en curso.

la siguiente solución funciona excelente para mí:

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

Para $monday, este método siempre devuelve el lunes que comenzó esta semana natural. desafortunadamente, este método se basa en PHP 5.1 para analizar el formato de fecha o.

para conseguir cualquier día de la semana, usted podría intentar:

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); 
} 

Uso:

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

Como sugiere la respuesta superior, utilizando la función de PHP strtotime() es la manera más fácil.

Sin embargo, en lugar de usar sentencias if como sugiere, simplemente puede restablecer al domingo anterior y obtener las fechas que necesita desde allí.

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

Estaba buscando algo similar, excepto que quería un lunes, no solo esta semana. Esto es lo que se me ocurrió:

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

Acepta una fecha arbitraria y da el domingo. Luego puede agregar fácilmente días de regreso para pasar de lunes a sábado.

33

mejor solución sería:

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

Esto es genial. Gracias. El trabajo es corto y legible –

+0

Esto es mucho mejor que la respuesta aceptada. No hay diferencia entre "este viernes" y "el próximo viernes". Tienes que usar "viernes esta semana" y "viernes la semana que viene" – DrDamnit

0

que utilizo:

$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'))); 
Cuestiones relacionadas