2011-12-16 3 views
13

Возможно ли получить первую/последнюю дату недели с использованием PHP Relative Date Time format?Получение первой или последней даты недели

Я попытался сделать:

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 

Как вы можете see он не выдает правильные даты.

Согласно the docs, это должно быть возможно, если я прав.

Я делаю что-то ужасное неправильно?

EDIT

мне нужно использовать в PHP DateTime для дат в далеком будущем.

UPDATE

Он получает только незнакомец прямо сейчас. Я провел еще несколько тестов.

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

Разве это не зависит от языкового стандарта, если воскресенье или понедельник - первый день недели? – mario

+0

@mario: Я не знаю, что ты говоришь мне. В любом случае первые два должны выводить одно и то же. То же самое касается двух последних ИМХО. Будут ли они начинаться в воскресенье/понедельник – PeeHaa

ответ

21

Согласно документации строки формата "первый день" и "последний день" разрешается только в течение нескольких месяцев, не в течение нескольких недель. См. http://www.php.net/manual/en/datetime.formats.relative.php

Если вы комбинируете первый и последний день с инструкцией недели, результат либо удаляет парсер, либо то, чего вы не ожидали (обычно первый или последний день месяца, а не неделю).

Разница, которую вы видите между Win и Linux, вероятно, связана только с различными настройками отчетов об ошибках.

Чтобы получить первый и последний день текущего использования недели:

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

Чтобы получить первый и последний день недели 50 использования:

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

EDIT:

Если вы хотите использовать метод модификации для абсолютных номеров недель, вы должны использовать форматы, определенные в http://www.php.net/manual/en/datetime.formats.compound.php:

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

Возможно, вы правы. Хотя я не вижу, где он заявляет, что его можно использовать только в течение нескольких месяцев (может быть, мне просто нужно немного поспать :)). Сообщения об ошибках BTW одинаковы на обеих машинах. Итак, что вы говорите, что возможно только получить первую/последнюю дату текущей (возможно, следующей, предыдущей и т. Д.) Недели, а не по недельному номеру? (Я знаю, что могу рассчитать это сам, просто подумал, что это будет более аккуратно) – PeeHaa

+0

В документах говорится: _'первый день '' of '? Устанавливает день первого числа текущего месяца. Эта фраза лучше всего использовать вместе с именем месяца, следующим за ней. – Jpsy

+0

И да, вы также можете использовать метод modify() для получения абсолютных недель. См. Мое редактирование выше. – 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

Это то, что я использую, чтобы получить первый и последний день недели с любой даты. В этом случае понедельник первый день недели ...

$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

Я большой поклонник использования Carbon библиотеки, что делает этот вид вещи очень легко.Например:

use Carbon\Carbon; 

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

Или, если вы предпочитаете иметь воскресенье быть первый день вашей недели:

use Carbon\Carbon; 

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

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

Кажется, это единственная библиотека даты, которая действительно работает. – besimple

2

, если первый день недели понедельник

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

еще если первый день - воскресенье

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

потому что в разные страны первый день недели возможно понедельник или воскресенье

Смежные вопросы