2011-12-16 35 views
13

¿Es posible obtener la primera/última fecha de una semana usando PHP Relative Date Time format?Obteniendo la primera/última fecha de la semana

He tratado de hacer:

date_default_timezone_set('Europe/Amsterdam'); 
$date = new DateTime(); 

$date->modify('first day of this week'); // to get the current week's first date 
echo $date->format('Y-m-d'); // outputs 2011-12-19 

$date->modify('first day of week 50'); // to get the first date of any week by weeknumber 
echo $date->format('Y-m-d'); // outputs 2011-12-18 

$date->modify('last day of this week'); // to get the current week's last date 
echo $date->format('Y-m-d'); // outputs 2011-12-17 

$date->modify('last day of week 50'); // to get the last date of any week by weeknumber 
echo $date->format('Y-m-d'); // outputs 2011-12-18 

Como se puede see que no emitirá las fechas correctas.

De acuerdo con the docs esto debería ser posible si estoy en lo correcto.

¿Estoy haciendo algo terrible mal?

EDITAR

necesito utilizar DateTime de PHP para las fechas en el futuro lejano.

ACTUALIZACIÓN

Se pone único extraño ahora. He hecho algunas pruebas más.

de Windows PHP 5.3.3

2011-12-01 

Warning: DateTime::modify() [datetime.modify]: Failed to parse time string (first day of week 50) at position 13 (w): The timezone could not be found in the database in C:\Users\Gerrie\Desktop\ph\Websites\Charts\www.charts.com\public\index.php on line 9 
2011-12-01 
2011-11-30 

Warning: DateTime::modify() [datetime.modify]: Failed to parse time string (last day of week 50) at position 12 (w): The timezone could not be found in the database in C:\Users\Gerrie\Desktop\ph\Websites\Charts\www.charts.com\public\index.php on line 15 
2011-11-30 

Linux 5.3.8

2011-12-01 
2011-12-01 
2011-11-30 
2011-11-30 
+1

¿Esto no depende de la localidad, si el domingo o el lunes es el primer día de la semana? – mario

+0

@mario: No sé si me lo dices. De cualquier forma, los dos primeros deberían emitir lo mismo. Lo mismo ocurre con los dos últimos en mi humilde opinión. Si comienza el domingo/lunes – PeeHaa

Respuesta

21

De acuerdo con documentos de las cadenas de formato "primer día de" y "último día de" sólo se permite durante meses, no por semanas. Ver http://www.php.net/manual/en/datetime.formats.relative.php

Si combina el primer y el último día de una declaración semanal, el resultado puede sonar el analizador o es algo que no esperaba (generalmente el primer o último día de un mes, no una semana).

La diferencia que ve entre Win y Linux es probablemente solo debido a las diferentes configuraciones de informes de errores.

Para obtener el primer y último día de la actual utilización semana:

$date->modify('this week'); 
$date->modify('this week +6 days'); 

Para obtener el primer y último día de la semana 50 uso:

$date->setISODate(2011, 50); 
$date->setISODate(2011, 50, 7); 

EDIT:

Si desea utilizar el método de modificación para números de semana absolutos, debe usar los formatos definidos en http://www.php.net/manual/en/datetime.formats.compound.php:

$date->modify('2011W50'); 
$date->modify('2011W50 +6 days'); 
+0

Puede que tenga razón en eso. Aunque no veo dónde dice, solo se puede usar durante meses (podría ser solo que necesite dormir un poco :)). El informe de errores BTW es el mismo en ambas máquinas. Entonces, ¿qué estás diciendo que solo es posible obtener la primera/última fecha de la semana actual (posible también siguiente, anterior, etc.) y no por número de semana? (Sé que puedo calcularlo yo mismo, pensé que esto sería más ordenado) – PeeHaa

+0

Los documentos dicen: _ 'primer día' 'de'? Establece el día del primero del mes actual. Esta frase se usa mejor junto con el nombre de un mes siguiente. – Jpsy

+0

Y sí, también puede usar el método modify() para obtener semanas absolutas. Ver mi edición arriba. – Jpsy

0
function getweek_first_last_date($date) 
{ 
    $cur_date = strtotime($date); // Change to whatever date you need 
    // Get the day of the week: Sunday = 0 to Saturday = 6 
    $dotw = date('w', $cur_date); 
    if($dotw>1) 
    { 
     $pre_monday = $cur_date-(($dotw-1)*24*60*60); 
     $next_sunday = $cur_date+((7-$dotw)*24*60*60); 
    } 
    else if($dotw==1) 
    { 
     $pre_monday = $cur_date; 
     $next_sunday = $cur_date+((7-$dotw)*24*60*60); 
    } 
    else if($dotw==0) 
    { 
     $pre_monday =$cur_date -(6*24*60*60);; 
     $next_sunday = $cur_date; 
    } 

    $date_array = array(); 
    $date_array['start_date_of_week'] = $pre_monday; 
    $date_array['end_date_of_week'] = $next_sunday; 

    return $date_array; 
} 

$date = '2013-12-22'; 
getweek_first_last_date($date); 


Output : 
$array_of_week = Array 
(
    [start_date_of_week] => 1387152000 
    [end_date_of_week] => 1387670400 
) 

$start_date =date('d/m/Y', $array_of_week['start_date_of_week']) 
2

Esto es lo que estoy utilizando para obtener el primer y último día de la semana de cualquier fecha . En este caso, el lunes es el primer día de la semana ...

$date = date('Y-m-d'); // you can put any date you want 
$nbDay = date('N', strtotime($date)); 
$monday = new DateTime($date); 
$sunday = new DateTime($date); 
$monday->modify('-'.($nbDay-1).' days'); 
$sunday->modify('+'.(7-$nbDay).' days'); 
0
<code> 
function getlastweek_first_last_date() 
{ 
    $cur_date = strtotime(date('Y-m-d')); // Change to whatever date you need 
    // Get the day of the week: Sunday = 0 to Saturday = 6 
    $previousweekcurdate = $cur_date - (7*24*3600); 
    $cur_date = $previousweekcurdate; 
    $dotw = date('w', $cur_date); 
    if($dotw>1) 
    { 
     $pre_sunday = $cur_date-(($dotw-1)*24*60*60) - (24*60*60); 
     $next_satday = $cur_date+((7-$dotw)*24*60*60)- (24*60*60); 
    } 
    else if($dotw==1) 
    { 
     $pre_sunday = $cur_date- (24*60*60); 
     $next_satday = $cur_date+((7-$dotw)*24*60*60)- (24*60*60); 
    } 
    else if($dotw==0) 
    { 
     $pre_sunday =$cur_date -(6*24*60*60)- (24*60*60); 
     $next_satday = $cur_date- (24*60*60); 
    } 

    $pre_sunday = date('Y-m-d',$pre_sunday)." 00:00:00"; 
    $next_satday = date('Y-m-d',$next_satday)." 23:59:59"; 
    $date_array = array(); 
    $date_array['sdoflw'] = $pre_sunday; 
    $date_array['edoflw'] = $next_satday; 

    return $date_array; 
} 

$date_array = getlastweek_first_last_date(); 
echo $start_date_of_week = $date_array['sdoflw']; 
echo $end_date_of_week = $date_array['edoflw']; 

</code> 
29

Soy un gran fan de la utilización de la biblioteca Carbon, lo que hace este tipo de cosas realmente fácil.Por ejemplo:

use Carbon\Carbon; 

$monday = Carbon::now()->startOfWeek() 
$sunday = Carbon::now()->endOfWeek() 

O, si lo prefiere tener Domingo sea el primer día de la semana:

use Carbon\Carbon; 

Carbon::setWeekStartsAt(Carbon::SUNDAY); 
Carbon::setWeekEndsAt(Carbon::SATURDAY); 

$sunday = Carbon::now()->startOfWeek() 
$saturday = Carbon::now()->endOfWeek() 
+1

Esta parece ser la única biblioteca de fechas que realmente funciona. – besimple

2

si el primer día de la semana es el lunes

$date->modify('Monday this week'); 

demás si el primer día es el domingo

$date->modify('Sunday this week'); 

porque en diferentes países primer día de la semana tal vez lunes o domingo

Cuestiones relacionadas