รับวันแรกของสัปดาห์ใน PHP?


124

ระบุMM-dd-yyyyรูปแบบวันที่มีใครช่วยขอวันแรกของสัปดาห์ได้ไหม


4
วันแรกของสัปดาห์หมายความว่าอย่างไร คุณหมายถึง Sun, Mon? หรือคุณหมายถึงวันที่ของวันแรกของสัปดาห์?
Jeffrey Hines

2
วันแรกของสัปดาห์จะคงที่นั่นคือวันจันทร์ (หรืออาจเป็นวันอาทิตย์) คุณหมายความว่าคุณต้องการรับวันที่ของวันจันทร์ก่อนวันที่กำหนดหรือไม่?
Jon Cram

PHP - 4 หรือ 5 เวอร์ชันใด
Jon Cram

วันที่ของวันอาทิตย์ของสัปดาห์ php 5
Iggy Ma

แปลกเขาขอDateTimeวิธีแก้ปัญหาและคำตอบส่วนใหญ่ไม่มีให้ =)
lin

คำตอบ:


143

นี่คือสิ่งที่ฉันใช้ ...

$day = date('w');
$week_start = date('m-d-Y', strtotime('-'.$day.' days'));
$week_end = date('m-d-Y', strtotime('+'.(6-$day).' days'));

$ dayมีตัวเลขตั้งแต่ 0 ถึง 6 แทนวันในสัปดาห์ (วันอาทิตย์ = 0 วันจันทร์ = 1 ฯลฯ )
$ week_startมีวันที่สำหรับวันอาทิตย์ของสัปดาห์ปัจจุบันเป็น mm-dd-yyyy
$ week_endมีวันที่สำหรับวันเสาร์ของสัปดาห์ปัจจุบันเป็น mm-dd-yyyy


1
แต่มันหมายถึงจุดเริ่มต้นและจุดสิ้นสุดของ 'สัปดาห์นี้' ใช่ไหม?
Oki Erie Rinaldi

จะเป็นอย่างไรถ้าให้เลขสัปดาห์ และฉันต้องการให้มันคืนค่าเริ่มต้นและวันที่สิ้นสุดของสัปดาห์นั้น
Oki Erie Rinaldi

1
@OkiErieRinaldi คุณน่าจะเปิดคำถามใหม่เพื่อให้ได้รับความสนใจอย่างเหมาะสม
JadedCore

ไม่ต้องกังวลฉันเข้าใจแล้ว @JadedCore!
Oki Erie Rinaldi

ฉันไม่แน่ใจว่าทำไมอีกอันสูงกว่า ไม่ได้ผล แต่อันนี้ทำ! 3v4l.org/q6kKY
Jason

67
strtotime('this week', time());

แทนที่เวลา () วิธีวันอาทิตย์ถัดไป / วันจันทร์สุดท้ายจะไม่ทำงานเมื่อวันปัจจุบันคือวันอาทิตย์ / วันจันทร์


55
$monday = strtotime('last monday', strtotime('tomorrow'));
Lewis Buckley

this weekไม่ได้ผลหากคุณต้องการเริ่มต้นสัปดาห์ก่อนหน้านี้เสมอ แต่ความคิดเห็นของ @ LewisBuckley ทำเช่นนั้น
Smar

อาร์กิวเมนต์ที่สองtime()คือ optionnal หากคุณต้องการระบุวันนี้
Ifnot

ไม่ได้ผลสำหรับฉันฉันต้องเลือกไวยากรณ์ที่แตกต่างกันเล็กน้อยสำหรับ YTD, MTD, WTD
รอน

6
คำตอบนี้ให้ผลลัพธ์ที่ไม่สอดคล้องกันโดยขึ้นอยู่กับเวอร์ชัน PHP ที่ใช้: โซลูชันของ 3v4l.org/Z3k4E @ LewisBuckley สอดคล้องกับทุกเวอร์ชัน: 3v4l.org/Eeh9c
Chris Baker

62

strtotimeฟังก์ชั่นใช้งานง่ายมาก:

echo date("Y-m-d", strtotime('monday this week')), "\n";   

echo date("Y-m-d", strtotime('sunday this week')), "\n";

มันแตกต่างกันเล็กน้อยในเวอร์ชัน PHP :

เอาต์พุตสำหรับ 5.3.0 - 5.6.6, php7 @ 20140507 - 20150301, hhvm-3.3.1 - 3.5.1

2015-03-16
2015-03-22

เอาต์พุตสำหรับ 4.3.5 - 5.2.17

2015-03-23
2015-03-22

เอาต์พุตสำหรับ 4.3.0 - 4.3.4

2015-03-30
2015-03-29

เปรียบเทียบที่ Edge-Cases

คำอธิบายสัมพัทธ์เช่นสัปดาห์นี้มีบริบทของตัวเอง ต่อไปนี้แสดงผลลัพธ์ของสัปดาห์นี้วันจันทร์และวันอาทิตย์เมื่อเป็นวันจันทร์หรือวันอาทิตย์:

$date = '2015-03-16'; // monday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";   
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";

$date = '2015-03-22'; // sunday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";   
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";

Againt แตกต่างกันเล็กน้อยในเวอร์ชัน PHP :

เอาต์พุตสำหรับ 5.3.0 - 5.6.6, php7 @ 20140507 - 20150301, hhvm-3.3.1 - 3.5.1

2015-03-16
2015-03-22
2015-03-23
2015-03-29

เอาต์พุตสำหรับ 4.3.5 - 5.0.5, 5.2.0 - 5.2.17

2015-03-16
2015-03-22
2015-03-23
2015-03-22

เอาต์พุตสำหรับ 5.1.0 - 5.1.6

2015-03-23
2015-03-22
2015-03-23
2015-03-29

เอาต์พุตสำหรับ 4.3.0 - 4.3.4

2015-03-23
2015-03-29
2015-03-30
2015-03-29

เหตุใดจึงใช้ไม่ได้สำหรับวันที่ 2016-06-05 ซึ่งเป็นวันที่ในสัปดาห์ถัดไป

1
ขอบคุณสำหรับสิ่งนี้ฉันเพิ่งแก้ไขรหัสนี้เพื่อให้สามารถส่งผ่านพารามิเตอร์วันที่ที่เป็นทางเลือก $ dt = $ custom_date? strtotime ($ custom_date): เวลา (); $ monday = วันที่ ("Ymd", strtotime ('monday this week', $ dt)); $ sunday = วันที่ ("Ymd", strtotime ('วันอาทิตย์นี้', $ dt));
Ron Michael

47

ง่าย ๆ เข้าไว้ :

<?php    
$dateTime = new \DateTime('2020-04-01');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');    
?>

ที่มา: คู่มือ PHP

หมายเหตุ: เนื่องจากผู้ใช้บางคนแสดงความคิดเห็นค่า $ dateTime จะได้รับการแก้ไข


แก้ไข: พิมพ์ผิดหรือไวยากรณ์ที่ไม่รู้จัก? \ มาจากไหน? $dateTime = new \DateTime('2012-05-14');
Sliq

2
ฉันกำลังทำเช่นนี้เพื่อหลีกเลี่ยงความขัดแย้งใด ๆ กับวัตถุที่โหลดอัตโนมัติของแอปพลิเคชันของคุณ นั่นเหมือนกับเส้นทางสัมบูรณ์หรือเส้นทางสัมพัทธ์
job3dot5

9
@Panique - "ไวยากรณ์ที่ไม่รู้จัก" คือไวยากรณ์ Namespace ของ PHP 5.3 Namespacing ช่วยให้คุณสามารถนำหน้าคลาสด้วยเนมสเปซตามด้วยแบ็กสแลช ที่นี่เขาใช้มันโดยไม่มีเนมสเปซเพื่อระบุDateTimeคลาสหลักซึ่งหมายความว่าโค้ดจะใช้งานได้แม้ว่าคุณจะมีคลาสอื่นที่เรียกDateTimeในเนมสเปซปัจจุบันก็ตาม
Spudley

ชื่อวันเป็นภาษาอังกฤษเสมอหรือไม่?
Marwelln

1
ส่วนโคลนทำงานไม่ถูกต้อง คุณควรโคลนก่อนจากนั้นจึงทำการโคลนหากคุณต้องการต้นฉบับ
Farid Movsumov

25
$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));

สิ่งนี้จะให้วันในสัปดาห์ของวันที่ที่กำหนดโดยที่0= วันอาทิตย์และ6= วันเสาร์ จากนั้นคุณสามารถคำนวณย้อนหลังไปยังวันที่คุณต้องการได้


6
คำตอบนี้จะคืนค่าไม่ว่าวันที่กำหนดจะเป็นวันอาทิตย์หรือวันจันทร์เป็นต้น แต่ผู้ถามได้ถามวันที่เป็นวันอาทิตย์ของสัปดาห์ของวันที่ที่ระบุไว้ในความคิดเห็นของเขาในคำถามเดิม
Rakib

19

คำถามนี้ต้องการคำตอบDateTimeที่ดี: -

function firstDayOfWeek($date)
{
    $day = DateTime::createFromFormat('m-d-Y', $date);
    $day->setISODate((int)$day->format('o'), (int)$day->format('W'), 1);
    return $day->format('m-d-Y');
}

var_dump(firstDayOfWeek('06-13-2013'));

เอาท์พุท: -

string '06-10-2013' (length=10)

สิ่งนี้จะจัดการกับขอบเขตปีและปีอธิกสุรทิน


18

แก้ไข: ลิงก์ด้านล่างไม่ทำงานบนเวอร์ชันของ PHP ที่ระบุอีกต่อไป มันทำงานบน PHP 5.6 ซึ่งช่วยเพิ่มความน่าเชื่อถือของ strtotime แต่ยังไม่สมบูรณ์แบบ! ผลลัพธ์ในตารางเป็นผลลัพธ์สดจาก PHP 5.6

สำหรับสิ่งที่คุ้มค่านี่คือรายละเอียดของพฤติกรรมที่ว่องไวของ strtotime เมื่อกำหนดกรอบอ้างอิงที่สอดคล้องกัน:

http://gamereplays.org/reference/strtotime.php

โดยพื้นฐานแล้วมีเพียงสตริงเหล่านี้เท่านั้นที่จะให้วันที่เดียวกันกับคุณได้อย่างน่าเชื่อถือไม่ว่าคุณจะอยู่ในวันใดของสัปดาห์เมื่อคุณโทรหา:

strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday"); 

บทความนี้ยังให้รหัสเฉพาะสำหรับใช้: $ start_of_week = strtotime ("วันจันทร์หน้า - 1 สัปดาห์"); // จะกลับมาในวันจันทร์ของสัปดาห์ปัจจุบันเริ่มเวลา 00:00:00 น. "$ end_of_week = strtotime (" วันจันทร์ถัดไป - 1 วินาที "); // จะกลับมาในวันอาทิตย์ของสัปดาห์ปัจจุบันสิ้นสุดเวลา 23:59:59 น."
Scott M. Stolz

11

รหัสต่อไปนี้ควรใช้กับวันที่ที่กำหนดเองเพียงใช้รูปแบบวันที่ที่ต้องการ

$custom_date = strtotime( date('d-m-Y', strtotime('31-07-2012')) ); 
$week_start = date('d-m-Y', strtotime('this week last monday', $custom_date));
$week_end = date('d-m-Y', strtotime('this week next sunday', $custom_date));
echo '<br>Start: '. $week_start;
echo '<br>End: '. $week_end;

ฉันทดสอบโค้ดด้วย PHP 5.2.17 ผลลัพธ์:

Start: 30-07-2012
End: 05-08-2012

1
เป็นที่น่าสังเกตว่าสิ่งนี้จะส่งคืนวันจันทร์ก่อนหน้าเสมอดังนั้นหาก $ custom_date เป็นวันจันทร์ก็จะส่งคืนวันจันทร์ที่เร็วกว่านั้นหนึ่งสัปดาห์
Hill79

2
ทำงานไม่ถูกต้องวันนี้เป็นวันอาทิตย์ผลลัพธ์คือ: เริ่ม: 09-09-2556 สิ้นสุด:
22-09-2556

10

สมมติว่าวันจันทร์เป็นวันแรกของสัปดาห์จะได้ผล:

echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));

1
"MM-dd-yyyy" ไม่เหมือนกับ "Ymd" โปรดปรับแต่งคำตอบของคุณให้เหมาะกับคำถามที่เจาะจง
Yevgeniy Afanasyev

1
date ("MM-dd-yyyy") แสดงวันที่เป็น: NovNov-0202-15151515 ฉันหวังว่ามันควรจะเป็นวันที่ ("Mdy") ซึ่งแสดงวันที่ที่อ่านได้เช่น: Nov-02-15
shasi

"MM-dd-yyyy" มาจากคำถาม หากคุณไม่แน่ใจว่ามันหมายถึงอะไร - ถามในความคิดเห็นของคำถาม ขอบคุณสำหรับการแก้ไขคำตอบของคุณ
Yevgeniy Afanasyev

9

แล้วเรื่องนี้ล่ะ?

$first_day_of_week = date('m-d-Y', strtotime('Last Monday', time()));
$last_day_of_week = date('m-d-Y', strtotime('Next Sunday', time()));

8
วันจันทร์สุดท้ายของวันจันทร์จะให้คุณเป็นวันจันทร์ก่อนหน้า
Ikke

8

นี่คือสิ่งที่ผมใช้จะได้รับวันแรกและวันสุดท้ายของสัปดาห์จากวันที่ใดในกรณีนี้วันจันทร์เป็นวันแรกของสัปดาห์ ...

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

1
นั่นคือคำตอบที่แท้จริง!
Manuel

1
ใช้งานได้เหมือนมีเสน่ห์!
ลีกา

6

ฉันกำลังพิจารณาวันอาทิตย์เป็นวันแรกและวันเสาร์เป็นวันสุดท้ายของสัปดาห์

$m = strtotime('06-08-2012');  
$today =   date('l', $m);  
$custom_date = strtotime( date('d-m-Y', $m) );   
if ($today == 'Sunday') {  
   $week_start = date("d-m-Y", $m);  
} else {  
  $week_start = date('d-m-Y', strtotime('this week last sunday', $custom_date));  
}  

if ($today == 'Saturday') {  
  $week_end = date("d-m-Y", $m);
} else {  
  $week_end = date('d-m-Y', strtotime('this week next saturday', $custom_date));  
}
echo '<br>Start: '. $week_start;  
echo '<br>End: '. $week_end;  

เอาท์พุต:

เริ่ม: 05-08-2012
สิ้นสุด: 11-08-2012


5

แล้วเรื่องนี้ล่ะ?

$day_of_week = date('N', strtotime($string_date));
$week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days"));
$week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));

4

ลองสิ่งนี้:

function week_start_date($wk_num, $yr, $first = 1, $format = 'F d, Y')
{
    $wk_ts  = strtotime('+' . $wk_num . ' weeks', strtotime($yr . '0101'));
    $mon_ts = strtotime('-' . date('w', $wk_ts) + $first . ' days', $wk_ts);
    return date($format, $mon_ts);
}

$sStartDate = week_start_date($week_number, $year);
$sEndDate   = date('F d, Y', strtotime('+6 days', strtotime($sStartDate)));

(จากหัวข้อฟอรัมนี้ )


ฉันจะหาหมายเลขสัปดาห์และปีในทั้งหมดนั้นได้อย่างไร ฉันมีวันที่สตริงในรูปแบบ MM-dd-yyyy
Iggy Ma

4

นี่เป็นวิธีแก้ปัญหาที่สั้นและอ่านง่ายที่สุดที่ฉันพบ:

    <?php
    $weekstart = strtotime('monday this week');
    $weekstop = strtotime('sunday this week 23:59:59');
    //echo date('d.m.Y H:i:s', $weekstart) .' - '. date('d.m.Y H:i:s', $weekstop);
    ?>

strtotimenew DateTime()->getTimestamp()จะเร็วกว่า


สมบูรณ์แบบดูการแก้ไขของฉันสำหรับวันที่ออสเตรเลีย / สหราชอาณาจักร
zanderwar


2

เมื่อใช้ฟังก์ชันต่อไปนี้เวอร์ชัน PHP ก่อน 5.3 จะให้วันแรกของสัปดาห์ของวันที่กำหนด (ในกรณีนี้คือวันอาทิตย์ 2013-02-03):

<?php
  function startOfWeek($aDate){
    $d=strtotime($aDate);
    return strtotime(date('Y-m-d',$d).' - '.date("w",$d).' days');
  }

  echo(date('Y-m-d',startOfWeek("2013-02-07")).'
');
?>

2
$today_day = date('D'); //Or add your own date
$start_of_week = date('Ymd');
$end_of_week = date('Ymd');

if($today_day != "Mon")
    $start_of_week = date('Ymd', strtotime("last monday"));

if($today_day != "Sun")
                    $end_of_week = date('Ymd', strtotime("next sunday"));

2
$monday = date('d-m-Y',strtotime('last monday',strtotime('next monday',strtotime($date))));

คุณต้องได้รับวันจันทร์ถัดไปก่อนแล้วจึงได้รับ 'วันจันทร์สุดท้าย' ของวันจันทร์ถัดไป ดังนั้นหากวันที่ระบุเป็นวันจันทร์มันจะส่งคืนวันเดียวกันไม่ใช่วันจันทร์ของสัปดาห์ที่แล้ว


2

หากคุณต้องการให้วันจันทร์เป็นวันเริ่มต้นสัปดาห์ของคุณให้ทำดังนี้

$date = '2015-10-12';
$day = date('N', strtotime($date));
$week_start = date('Y-m-d', strtotime('-'.($day-1).' days', strtotime($date)));
$week_end = date('Y-m-d', strtotime('+'.(7-$day).' days', strtotime($date)));

อะไรทำให้สิ่งนี้ดีกว่าสำหรับคำตอบนี้หรือคำตอบนี้ ? สำหรับฉันดูเหมือนว่ามีตัวเลือกมากเกินพอใน 30 คำตอบอื่น ๆ ...
Mogsdad

ขอบคุณ. นี่เป็นวิธีง่ายๆและใช้งานได้เหมือนมีเสน่ห์
Oleg Popov

2

วิธีที่ชาญฉลาดในการทำเช่นนี้คือให้ PHP จัดการกับความแตกต่างของเขตเวลาและเวลาออมแสง (DST) ให้ฉันแสดงวิธีการทำ

ฟังก์ชันนี้จะสร้างทุกวันตั้งแต่วันจันทร์ถึงวันศุกร์รวม (สะดวกในการสร้างวันทำงานในสัปดาห์):

class DateTimeUtilities {
    public static function getPeriodFromMondayUntilFriday($offset = 'now') {
        $now = new \DateTimeImmutable($offset, new \DateTimeZone('UTC'));
        $today = $now->setTime(0, 0, 1);

        $daysFromMonday = $today->format('N') - 1;

        $monday = $today->sub(new \DateInterval(sprintf('P%dD', $daysFromMonday)));
        $saturday = $monday->add(new \DateInterval('P5D'));

        return new \DatePeriod($monday, new \DateInterval('P1D'), $saturday);
    }
}

foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday() as $day) {
    print $day->format('c');
    print PHP_EOL;
}

การดำเนินการนี้จะส่งกลับวันที่วันจันทร์ - ศุกร์สำหรับสัปดาห์ปัจจุบัน หากต้องการทำเช่นเดียวกันสำหรับวันที่กำหนดให้ส่งวันที่เป็นพารามิเตอร์ไปDateTimeUtilities ::getPeriodFromMondayUntilFridayดังนี้:

foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00') as $day) {
    print $day->format('c');
    print PHP_EOL;
}

//prints 
//2017-01-02T00:00:01+00:00
//2017-01-03T00:00:01+00:00
//2017-01-04T00:00:01+00:00
//2017-01-05T00:00:01+00:00
//2017-01-06T00:00:01+00:00

สนใจเฉพาะวันจันทร์ตามที่ OP ถาม?

$monday = DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00')->getStartDate()->format('c');
print $monday;
// prints
//2017-01-02T00:00:01+00:00


1
<?php
/* PHP 5.3.0 */

date_default_timezone_set('America/Denver'); //Set apprpriate timezone
$start_date = strtotime('2009-12-15'); //Set start date

//Today's date if $start_date is a Sunday, otherwise date of previous Sunday
$today_or_previous_sunday = mktime(0, 0, 0, date('m', $start_date), date('d', $start_date), date('Y', $start_date)) - ((date("w", $start_date) ==0) ? 0 : (86400 * date("w", $start_date)));

//prints 12-13-2009 (month-day-year)
echo date('m-d-Y', $today_or_previous_sunday);

?>

(หมายเหตุ: MM, dd และ yyyy ในคำถามไม่ใช่ไวยากรณ์รูปแบบวันที่ php มาตรฐาน - ฉันไม่แน่ใจว่าหมายถึงอะไรดังนั้นฉันจึงตั้งค่า $ start_date ด้วย ISO year-month-day)


1

ทำได้อีกทาง ....

$year = '2014';
$month = '02';
$day = '26';

$date = DateTime::createFromFormat('Y-m-d H:i:s', $year . '-' . $month . '-' . $day . '00:00:00');
$day = date('w', $date->getTimestamp());

// 0=Sunday 6=Saturday
if($day!=0){

   $newdate = $date->getTimestamp() - $day * 86400;  //86400 seconds in a day

   // Look for DST change 
   if($old = date('I', $date->getTimestamp()) != $new = date('I', $newdate)){
       if($old == 0){
           $newdate -= 3600;  //3600 seconds in an hour
       } else {
           $newdate += 3600;
       }
   }

   $date->setTimestamp($newdate);
}

echo $date->format('D Y-m-d H:i:s');

1

วิธีที่ง่ายที่สุดในการรับวันแรก (วันจันทร์) ของสัปดาห์ปัจจุบันคือ:

strtotime("next Monday") - 604800;

โดยที่ 604800 - นับเป็นวินาทีใน 1 สัปดาห์ (60 * 60 * 24 * 7)

รหัสนี้ได้รับในวันจันทร์หน้าและลดลงเป็นเวลา 1 สัปดาห์ รหัสนี้จะทำงานได้ดีในทุกวันของสัปดาห์ แม้ว่าวันนี้จะเป็นวันจันทร์ก็ตาม.


1

ฉันพบว่าสิ่งนี้ค่อนข้างน่าผิดหวังเนื่องจากเขตเวลาของฉันเป็นแบบออสเตรเลียและstrtotime()เกลียดวันที่ในสหราชอาณาจักร

หากวันนี้เป็นวันอาทิตย์strtotime("monday this week")จะส่งคืนในวันหลัง

เพื่อเอาชนะสิ่งนี้:

ข้อควรระวัง : ใช้ได้เฉพาะวันที่ในออสเตรเลีย / สหราชอาณาจักรเท่านั้น

$startOfWeek = (date('l') == 'Monday') ? date('d/m/Y 00:00') : date('d/m/Y', strtotime("last monday 00:00"));
$endOfWeek = (date('l') == 'Sunday') ? date('d/m/Y 23:59:59') : date('d/m/Y', strtotime("sunday 23:59:59"));

2
สิ่งนี้ใช้ได้กับวันที่ในสหรัฐอเมริกาด้วย ฉันได้ทดสอบสิ่งนี้กับเขตเวลาของ Newyork
Jayesh D

ตราบใดที่วันอาทิตย์ไม่ใช่วันแรกของสัปดาห์ (วันจันทร์ในออสเตรเลีย / สหราชอาณาจักร) ก็จะไม่เป็นไร
zanderwar

1

นี่คือหนึ่งซับสำหรับวันแรกของสัปดาห์ที่แล้วและวันสุดท้ายของสัปดาห์ที่แล้วเป็นDateTimeวัตถุ

$firstDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 7))
                             ->setTime(0, 0, 0);
$lastDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 1))
                            ->setTime(23, 59, 59);

1
$string_date = '2019-07-31';
echo $day_of_week = date('N', strtotime($string_date));
echo $week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days"));
echo $week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));

มีประโยชน์เมื่อเรามีวันจันทร์เป็นวันแรกของสัปดาห์ (จันทร์ - อาทิตย์)
Kamran Mushtaq

0

ฉันเคยเจอคำถามนี้มาสองสามครั้งแล้วและมักจะแปลกใจที่ฟังก์ชันวันที่ไม่ได้ทำให้ง่ายขึ้นหรือชัดเจนขึ้น นี่คือวิธีแก้ปัญหาของฉันสำหรับ PHP5 ที่ใช้DateTimeคลาส:

/**
 * @param DateTime $date A given date
 * @param int $firstDay 0-6, Sun-Sat respectively
 * @return DateTime
 */
function getFirstDayOfWeek(DateTime $date, $firstDay = 0) {
    $offset = 7 - $firstDay;
    $ret = clone $date;
    $ret->modify(-(($date->format('w') + $offset) % 7) . 'days');
    return $ret;
}

จำเป็นในการโคลนเพื่อหลีกเลี่ยงการเปลี่ยนแปลงวันที่เดิม


0

สิ่งที่เกี่ยวกับ:

$date = "2013-03-18"; 
$searchRow = date("d.m.Y", strtotime('last monday',strtotime($date." + 1 day")));
echo "for date " .$date ." we get this monday: " ;echo $searchRow; echo '<br>';

มันไม่ใช่วิธีที่ดีที่สุด แต่ฉันทดสอบแล้วและถ้าฉันอยู่ในสัปดาห์นี้ฉันได้รับวันจันทร์ที่ถูกต้องและถ้าฉันอยู่ในวันจันทร์ฉันจะได้วันจันทร์นั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.