วิธีค้นหาวันในสัปดาห์ใน php ในเขตเวลาเฉพาะ


97

ฉันสับสนในขณะที่ใช้ php เพื่อจัดการวันที่ / เวลา

สิ่งที่ฉันพยายามทำคือ: เมื่อผู้ใช้เยี่ยมชมหน้าของฉันฉันกำลังถามเขตเวลาของเขาจากนั้นแสดง 'วันในสัปดาห์' ในเขตเวลาของเขา

ฉันไม่ต้องการใช้วันของเบราว์เซอร์ ฉันต้องการทำการคำนวณนี้ใน php

นี่คือวิธีที่ฉันพยายามบรรลุ:

  1. เขตเวลาที่ผู้ใช้ป้อน
  2. การประทับเวลา Unix คำนวณโดยฟังก์ชัน php time ()

แต่ฉันไม่รู้ว่าจะดำเนินการอย่างไร ... ฉันจะได้ 'วันของสัปดาห์' ในเขตเวลานี้ได้อย่างไร

คำตอบ:


145
$dw = date( "w", $timestamp);

โดยที่ $ dw จะเป็น 0 (สำหรับวันอาทิตย์) ถึง 6 (สำหรับวันเสาร์) ดังที่คุณเห็นที่นี่: http://www.php.net/manual/en/function.date.php


65
เนื่องจาก php 5.1.0 คุณสามารถใช้date("N", $timestamp)เพื่อรับ1..7ค่าได้ตั้งแต่วันจันทร์ ในเวอร์ชันเก่าคุณสามารถใช้เคล็ดลับ(date("w", $timestamp) + 6) % 7เพื่อรับ0..6ค่าเริ่มตั้งแต่วันจันทร์
oluckyman

22
ฉันสับสนมาก โหวตเยอะขนาดนี้ได้ยังไง คำถามคือวิธีรับวันในสัปดาห์ในเขตเวลาที่เจาะจงไม่ใช่เขตเวลาของเว็บเซิร์ฟเวอร์ไม่ใช่ GMT คำนี้ตอบคำถามส่วนแรก แต่ไม่สนใจส่วนที่สองของคำถามโดยสิ้นเชิง
tfinniga

6
@tfinniga ฉันคิดว่าเหตุผลก็คือหลายคนมาถึงคำถามนี้เมื่อค้นหาวิธีรับวันในสัปดาห์ (เหมือนที่ฉันทำ) แล้วโหวตให้เพราะมันตอบคำถามของพวกเขา :)
dav

โปรดทราบว่าวันที่ () และ mktime () ใช้งานได้ตราบเท่าที่คุณย้ายภายในยุค UNIX (1970 - 2038 / 0x0 - 0x7FFFFFFF เป็นวินาที) ใช้ PHP ใหม่ "Date and Time Related Extensions"
eosphere

1
@dav ว้าวคุณอาจจะพูดถูก แต่ดูเหมือนจะเป็นเหตุผลที่ไม่ดีจริงๆ ฉันรู้สึกว่าฉันเริ่มมีความคิดเห็นที่ชัดเจนเกี่ยวกับนักพัฒนา php โดยเฉลี่ย
tfinniga

117

ทางออกของฉันคือ:

$tempDate = '2012-07-10';
echo date('l', strtotime( $tempDate));

ผลลัพธ์คือ: Tuesday

$tempDate = '2012-07-10';
echo date('D', strtotime( $tempDate));

ผลลัพธ์คือ: Tue


นี้ทำงานได้อย่างสวยงาม ฉันใช้วันที่ ('D', strtotime ($ DATE)) ตัวแปร $ DATE ของฉันอยู่ในรูปแบบที่ถูกต้องแล้ว ฉันใช้สิ่งนี้เพื่อระบุ DOW ในฐานข้อมูลการรายงานที่ฉันทำ เมื่อค้นหาในหลาย ๆ วันการมีตัวย่อ DOW เพิ่มเติมเล็กน้อยนั้นดี
user208145

22

ฉันคิดว่านี่เป็นคำตอบที่ถูกต้องเพียงแค่เปลี่ยนEurope/Stockholmเป็นเขตเวลาของผู้ใช้

$dateTime = new \DateTime(
    'now',
    new \DateTimeZone('Europe/Stockholm')
);
$day = $dateTime->format('N');

การแสดงตัวเลข ISO-8601 ของวันในสัปดาห์ (เพิ่มใน PHP 5.1.0) 1 (สำหรับวันจันทร์) ถึง 7 (สำหรับวันอาทิตย์)

http://php.net/manual/en/function.date.php

สำหรับรายการโซนเวลาที่รองรับโปรดดูที่ http://php.net/manual/en/timezones.php


20

ขอบคุณมากสำหรับความคิดเห็นอย่างรวดเร็วของคุณ

นี่คือสิ่งที่ฉันจะใช้ตอนนี้ โพสต์ฟังก์ชั่นที่นี่เพื่อให้ใครบางคนใช้งานได้

public function getDayOfWeek($pTimezone)
{

    $userDateTimeZone = new DateTimeZone($pTimezone);
    $UserDateTime = new DateTime("now", $userDateTimeZone);

    $offsetSeconds = $UserDateTime->getOffset(); 
    //echo $offsetSeconds;

    return gmdate("l", time() + $offsetSeconds);

}

รายงานหากคุณพบการแก้ไขใด ๆ



5

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

// let's say they're in the timezone GMT+10
$theirOffset = 10;  // $_GET['offset'] perhaps?
$offsetSeconds = $theirOffset * 3600;
echo gmdate("l", time() + $offsetSeconds);

3
$myTimezone = date_default_timezone_get();
date_default_timezone_set($userTimezone);
$userDay = date('l', $userTimestamp);
date_default_timezone_set($myTimezone);

ควรใช้งานได้ (ไม่ได้ทดสอบดังนั้น YMMV) ทำงานโดยการจัดเก็บเขตเวลาปัจจุบันของสคริปต์เปลี่ยนเป็นเขตเวลาที่ผู้ใช้ระบุรับวันในสัปดาห์จากdate()ฟังก์ชันตามการประทับเวลาที่ระบุจากนั้นตั้งค่าเขตเวลาของสคริปต์ให้กลับไปเป็นเขตเวลาเริ่มต้น

คุณอาจต้องผจญภัยกับตัวระบุเขตเวลา


2

"วันในสัปดาห์" เป็นสิ่งที่คุณจะได้รับโดยตรงจากฟังก์ชัน php date () ที่มีรูปแบบ "l" หรือ "N" ตามลำดับ ลองดู คู่มือ

แก้ไข: ขออภัยฉันอ่านโพสต์ของ Kalium ไม่ถูกต้องเขาอธิบายไปแล้ว ความผิดฉันเอง.


2

ตรวจสอบวันที่คือวันจันทร์หรือวันอาทิตย์ก่อนถึงวันจันทร์สุดท้ายหรือวันอาทิตย์สุดท้าย

 public function getWeek($date){
    $date_stamp = strtotime(date('Y-m-d', strtotime($date)));

     //check date is sunday or monday
    $stamp = date('l', $date_stamp);      
    $timestamp = strtotime($date);
    //start week
    if(date('D', $timestamp) == 'Mon'){            
        $week_start = $date;
    }else{
        $week_start = date('Y-m-d', strtotime('Last Monday', $date_stamp));
    }
    //end week
    if($stamp == 'Sunday'){
        $week_end = $date;
    }else{
        $week_end = date('Y-m-d', strtotime('Next Sunday', $date_stamp));
    }        
    return array($week_start, $week_end);
}

แม้ว่าอาจมีการใช้งาน แต่ก็ไม่ตอบคำถาม
outis

2

อิงตามวิธีการแก้ปัญหาอื่น ๆ ที่มีธงเพื่อสลับไปมาระหว่างสัปดาห์โดยเริ่มในวันอาทิตย์หรือวันจันทร์

function getWeekForDate($date, $weekStartSunday = false){

    $timestamp = strtotime($date);

    // Week starts on Sunday
    if($weekStartSunday){
        $start = (date("D", $timestamp) == 'Sun') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Last Sunday', $timestamp));
        $end = (date("D", $timestamp) == 'Sat') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Next Saturday', $timestamp));
    } else { // Week starts on Monday
        $start = (date("D", $timestamp) == 'Mon') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Last Monday', $timestamp));
        $end = (date("D", $timestamp) == 'Sun') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Next Sunday', $timestamp));
    }

    return array('start' => $start, 'end' => $end);
}

แม้ว่าอาจมีการใช้งาน แต่ก็ไม่ตอบคำถาม
outis

0

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

เนื่องจากเรากำลังพูดถึง datetimes ISO8601DateTimeนี่ดูเหมือนว่าเป็นไปได้ว่าสิ่งที่เป็นนามธรรมพื้นฐานคือ หนึ่งในการนำไปใช้งานที่เฉพาะเจาะจงคือวันที่และเวลาปัจจุบันซึ่งเป็นสิ่งที่คุณต้องการเมื่อมีการร้องขอไปยังแบ็กเอนด์ของคุณด้วยเหตุนี้Now()คลาส อันที่สองที่ใช้งานได้สำหรับคุณคือวันที่และเวลาปรับเป็นเขตเวลาบางส่วน AdjustedAccordingToTimeZoneไม่น่าแปลกใจก็เรียกว่า และสุดท้ายคุณต้องมีวันในสัปดาห์ในเขตเวลาของวันที่และเวลาที่ผ่านไป: มีLocalDayOfWeekคลาสสำหรับสิ่งนั้น ดังนั้นรหัสจึงมีลักษณะดังนี้:

(new LocalDayOfWeek(
    new AdjustedAccordingToTimeZone(
        new Now(),
        new TimeZoneFromString($_POST['timezone'])
    )
))
    ->value();

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการนี้ใช้เวลาดูที่นี่


-1
echo date('l', strtotime('today'));

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