it-swarm-pt.tech

Obtendo a primeira/última data da semana

É possível obter a primeira/última data de uma semana usando o formato de Data e Hora Relativa do PHP?

Eu tentei fazer:

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 você pode ver ele não exibe as datas corretas.

De acordo com os documentos isso deve ser possível se eu estiver correto.

Estou fazendo algo terrível errado?

EDIT

Eu preciso usar o DateTime do PHP para datas no futuro distante.

UPDATE

Só fica mais estranho agora. Eu fiz mais alguns testes.

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
15
PeeHaa

De acordo com a documentação, as strings de formato "primeiro dia de" e "último dia de" só são permitidas por meses, não por semanas. Veja http://www.php.net/manual/en/datetime.formats.relative.php

Se você combinar o primeiro e o último dia com uma instrução de semana, o resultado pode atrapalhar o analisador ou é algo que você não esperava (geralmente o primeiro ou o último dia de um mês, não uma semana).

A diferença que você vê entre o Win e o Linux é provavelmente apenas por causa de diferentes configurações de relatório de erros.

Para obter o primeiro e último dia da semana atual, use:

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

Para obter o primeiro e último dia da semana 50, use:

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

EDIT:

Se você quiser usar o método de modificação para números absolutos de semanas, você deve usar os formatos definidos em http://www.php.net/manual/en/datetime.formats.compound.php :

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

Eu sou um grande fã de usar o Carbon library, o que torna esse tipo de coisa muito fácil. Por exemplo:

use Carbon\Carbon;

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

Ou, se preferir que o domingo seja o primeiro dia da semana:

use Carbon\Carbon;

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

$sunday = Carbon::now()->startOfWeek()
$saturday = Carbon::now()->endOfWeek()
37
Jonathan

se primeiro dia da semana é segunda-feira

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

mais se o primeiro dia é domingo

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

porque em diferentes países primeiro dia da semana talvez segunda ou domingo

3
Vitaly

É isso que estou usando para obter o primeiro e último dia da semana de qualquer data . Neste caso, segunda-feira é o primeiro dia da 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');
2
ThEBiShOp
<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> 
0
Anudeep Sharma
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'])
0
sonia mehta