2011-12-16 85 views
13

Có thể lấy ngày đầu tiên/cuối cùng của tuần bằng cách sử dụng Relative Date Time format của PHP không?Nhận ngày đầu tiên/cuối cùng của tuần

Tôi đã cố gắng để làm:

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 

Như bạn có thể see nó không ra ngày chính xác.

Theo the docs điều này sẽ có thể nếu tôi chính xác.

Tôi đang làm điều gì đó khủng khiếp sai?

EDIT

tôi cần phải sử dụng DateTime PHP cho những ngày trong tương lai xa.

CẬP NHẬT

Nó được chỉ lạ bây giờ. Tôi đã thực hiện một số thử nghiệm khác.

của 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

Điều này không phụ thuộc vào miền địa phương, nếu chủ nhật hoặc thứ hai là ngày đầu tiên trong tuần? – mario

+0

@mario: Tôi không biết bạn nói với tôi. Dù bằng cách nào thì hai cái đầu tiên cũng sẽ xuất ra cùng một thứ. Cũng vậy với hai IMHO cuối cùng. Cho dù nó bắt đầu vào một chủ nhật/thứ hai – PeeHaa

Trả lời

21

Theo tài liệu định dạng chuỗi "ngày đầu tiên của" và "ngày cuối cùng của" chỉ được phép trong nhiều tháng, không phải trong nhiều tuần. Xem http://www.php.net/manual/en/datetime.formats.relative.php

Nếu bạn kết hợp ngày đầu tiên và ngày cuối cùng với tuyên bố một tuần, kết quả sẽ là trình phân tích cú pháp hoặc là thứ bạn không mong đợi (thường là ngày đầu tiên hoặc ngày cuối cùng của tháng, không phải một tuần).

Sự khác biệt mà bạn thấy giữa Win và Linux có thể chỉ vì các cài đặt báo cáo lỗi khác nhau.

Để có được ngày đầu tiên và cuối cùng của việc sử dụng tuần hiện tại:

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

Để có được ngày đầu tiên và cuối cùng của tuần 50 sử dụng:

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

EDIT:

Nếu bạn muốn sử dụng phương pháp sửa đổi cho số tuần tuyệt đối, bạn phải sử dụng các định dạng được xác định trong http://www.php.net/manual/en/datetime.formats.compound.php:

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

Bạn có thể đúng về điều đó. Mặc dù tôi không nhìn thấy nơi nó nói nó chỉ có thể được sử dụng trong nhiều tháng mặc dù (có thể chỉ là tôi cần một số giấc ngủ :)). Báo cáo lỗi BTW giống nhau trên cả hai máy. Vì vậy, những gì bạn đang nói rằng nó chỉ có thể có được ngày đầu tiên/cuối cùng của hiện tại (có thể cũng tiếp theo, trước đó vv) tuần và không phải bởi tuần? (Tôi biết tôi có thể tính toán nó bản thân mình chỉ nghĩ rằng điều này sẽ được neater) – PeeHaa

+0

Các tài liệu nói: _'first day '' of '? Đặt ngày của tháng đầu tiên của tháng hiện tại. Cụm từ này được sử dụng tốt nhất cùng với tên tháng theo sau nó._ – Jpsy

+0

Và có, bạn cũng có thể sử dụng phương thức modify() để có được tuần tuyệt đối. Xem chỉnh sửa của tôi ở trên. – 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

Đây là những gì tôi đang sử dụng để có được những ngày đầu tiên và cuối cùng trong tuần từ bất kỳ ngày. Trong trường hợp này, thứ hai là ngày đầu tiên trong tuần ...

$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

tôi là một fan hâm mộ lớn của việc sử dụng các thư viện Carbon, mà làm cho các loại điều này thực sự dễ dàng.Ví dụ:

use Carbon\Carbon; 

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

Hoặc, nếu bạn muốn có chủ nhật là ngày đầu tuần của bạn:

use Carbon\Carbon; 

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

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

Đây có vẻ là thư viện ngày duy nhất thực sự hoạt động. – besimple

2

nếu ngày đầu tiên của tuần là Thứ Hai

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

khác nếu ngày đầu tiên là Chủ Nhật

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

vì trong các quốc gia khác nhau ngày đầu tiên trong tuần có thể là Thứ Hai hoặc Chủ Nhật

Các vấn đề liên quan