จะค้นหาวันที่ของวันในสัปดาห์จากวันที่โดยใช้ PHP ได้อย่างไร?


86

หากฉันมี$date YYYY-mm-ddและต้องการได้รับเฉพาะ$day(ระบุโดย 0 (วันอาทิตย์) ถึง 6 (วันเสาร์)) ของสัปดาห์ที่YYYY-mm-ddอยู่ใน

ตัวอย่างเช่นถ้าผมได้2012-10-11เป็น$dateและ5เป็น$dayผมต้องการที่จะได้รับ2012-10-12ถ้าผมได้0เป็น$day,2012-10-14

แก้ไข:
พวกคุณส่วนใหญ่เข้าใจผิด ฉันมีวันที่$dateและต้องการรับวันที่ระบุโดย 0-6 ของสัปดาห์เดียวกัน$dateนั้น

ไม่ฉันไม่ต้องการวันของ$date...


สัปดาห์ของคุณจะเริ่มเมื่อไหร่? วันจันทร์หรือวันอาทิตย์? ฉันรู้ว่ามันเป็นวันจันทร์สำหรับคนส่วนใหญ่ แต่ฉันแค่ทำให้แน่ใจ: p
keyser

3
ฉันไม่คิดว่าคนที่ตอบเข้าใจคำถามอย่างถูกต้อง เขาไม่ต้องการรับตัวเลขของวันตามวันที่ (ซึ่งจะเป็นวันที่ ('w')) แต่เขาต้องการระบุวันที่และหมายเลขวันและรับวันที่ที่ตรงกันจากสัปดาห์เดียวกับวันที่ที่ระบุคือ .. .
Vafliik

คำตอบ:



90

คุณสามารถใช้ฟังก์ชัน date ():

date('w'); // day of week

หรือ

date('l'); // dayname

ตัวอย่างฟังก์ชั่นเพื่อรับหมายเลขวัน:

function getWeekday($date) {
    return date('w', strtotime($date));
}

echo getWeekday('2012-10-11'); // returns 4

17

ลอง

$date = '2012-10-11';
$day  = 1;
$days = array('Sunday', 'Monday', 'Tuesday', 'Wednesday','Thursday','Friday', 'Saturday');
echo date('Y-m-d', strtotime($days[$day], strtotime($date)));

2
แนวทางที่ดี แต่อย่างที่คุณเห็นในคำตอบของ Rezigned คุณยังสามารถใช้ '1 วัน' ทำให้อาร์เรย์ $ days นั้นไร้ประโยชน์
Zulakis

1
สิ่งนี้ดูเหมือนจะถูกต้องมากขึ้นเพราะจะส่งคืนวันที่ที่ถูกต้อง2012-10-14เมื่อคุณป้อน0@Rezigned ส่งกลับ2012-10-07
Carl

7

หากวันที่ของคุณเป็นอยู่แล้วDateTimeหรือDateTimeImmutableคุณสามารถใช้formatวิธีการ

$day_of_week = intval($date_time->format('w'));

สตริงรูปแบบจะเหมือนกับสตริงที่ฟังก์ชันวันที่ใช้


เพื่อตอบคำถามที่ตั้งใจไว้:

$date_time->modify($target_day_of_week - $day_of_week . ' days');

5

คู่มือ PHP กล่าวว่า:

w แสดงตัวเลขของวันในสัปดาห์

คุณจึงสามารถสร้างวันที่ด้วย mktime และใช้ในนั้นได้ date("w", $yourTime);


4

แค่:

2012-10-11 เป็น $ date และ 5 เป็น $ day

<?php
$day=5;
$w      = date("w", strtotime("2011-01-11")) + 1; // you must add 1 to for Sunday

echo $w;

$sunday = date("Y-m-d", strtotime("2011-01-11")-strtotime("+$w day"));

$result = date("Y-m-d", strtotime($sunday)+strtotime("+$day day"));

echo $result;

?>

$ result = '2012-10-12' คือสิ่งที่คุณต้องการ


1

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

$current = date("w", $date)
$offset = $day - $current
$new_date = new DateTime($date)
    ->add(
        new DateInterval($offset."D")
    )->format('Y-m-d')

1
ขอบคุณสำหรับแนวทางของคุณ แต่ไม่ฉันไม่จำเป็นต้องดำเนินการด้วยตนเอง ดูคำตอบของ Rezigned
Zulakis

1

ฉันต้องใช้วิธีแก้ปัญหาที่คล้ายกันสำหรับโปรตุเกส (บราซิล):

<?php
$scheduled_day = '2018-07-28';
$days = ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'];
$day = date('w',strtotime($scheduled_day));
$scheduled_day = date('d-m-Y', strtotime($scheduled_day))." ($days[$day])";
// provides 28-07-2018 (Sáb)

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