วันแรกของเดือนปัจจุบันใน php โดยใช้ date_modify เป็นวัตถุ DateTime


157

ฉันจะได้รับวันจันทร์ของสัปดาห์นี้ด้วย:

$monday = date_create()->modify('this Monday');

ฉันต้องการได้อย่างง่ายดายเหมือนกันในวันที่ 1 ของเดือนนี้ ฉันจะบรรลุสิ่งนั้นได้อย่างไร


เอ่อฉันมีปัญหา John Conde ตอบคำถามที่ฉันตอบ แต่ฉันลืมที่จะพูดถึงว่าต้องทำงานกับ 5.2 ดังนั้นจริง ๆ แล้วฉันจะใช้คำตอบของ Mr-sk ...
pihentagy

คำตอบ:


260

ต้องใช้ PHP 5.3 ในการทำงาน ("วันแรกของ" เปิดตัวใน PHP 5.3) มิฉะนั้นตัวอย่างข้างต้นเป็นวิธีเดียวที่จะทำได้:

<?php
    // First day of this month
    $d = new DateTime('first day of this month');
    echo $d->format('jS, F Y');

    // First day of a specific month
    $d = new DateTime('2010-01-19');
    $d->modify('first day of this month');
    echo $d->format('jS, F Y');

    // alternatively...
    echo date_create('2010-01-19')
      ->modify('first day of this month')
      ->format('jS, F Y');

ใน PHP 5.4+ คุณสามารถทำได้:

<?php
    // First day of this month
    echo (new DateTime('first day of this month'))->format('jS, F Y');

    echo (new DateTime('2010-01-19'))
      ->modify('first day of this month')
      ->format('jS, F Y');

ถ้าคุณชอบวิธีรัดกุมในการทำเช่นนี้และมีปีและเดือนในค่าตัวเลขคุณสามารถใช้date():

<?php
    echo date('Y-m-01'); // first day of this month
    echo date("$year-$month-01"); // first day of a month chosen by you

9
โปรดทราบว่าคุณไม่ต้องไปผ่าน->modify()ถ้าคุณต้องการเพียงแค่วันแรกของเดือนปัจจุบัน คุณสามารถส่งผ่าน'first day of this month'เพื่อสร้าง DateTime $date = new DateTime('first day of this month')โดยตรงเช่น: แค่พูดว่า ...
Dzhuneyt

334

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

วันแรกของเดือน:

date('Y-m-01');

วันสุดท้ายของเดือน:

date('Y-m-t');

10
IMO นี้เป็นวิธีที่ง่ายและอ่านง่ายที่สุดในการแก้ปัญหานี้หากคุณต้องการเพียงแค่แสดงสายอักขระของวันที่
Markus Amalthea Magnuson

5
date('Y-m-t');วันสุดท้ายของเดือนที่แล้วอาจจะคว้าใช้
Mark Tomlin

7
FYI: วันที่ 't' ('Ym-t') แสดงจำนวนวันในเดือนนั้นเสมอ วิธีที่ยอดเยี่ยมและเรียบง่ายในการรับวันสุดท้ายของเดือนปัจจุบัน
ปาสกาลไคลน์

1
ถ้าฉันใช้สิ่งนี้เพื่อพยายามรับวันในสัปดาห์date('w', '2015-05-01');จากนั้นฉันก็จบลงด้วยวันก่อนแทนที่จะเป็นวันจริง (นี่จะให้ฉัน 4 แทนที่ถูกต้อง 5)
PBwebD

5
มันยอดเยี่ยมมาก ฉันขยายมันเล็กน้อยเพื่อให้นาทีและขอบเขตสูงสุดสำหรับเวลาในเดือนโดยทำ: $monthStart = date('Y-m-01 00:00:00'); $monthEnd = date('Y-m-t 23:59:59');
H2ONOCK

32

นี่คือทุกสิ่งที่คุณต้องการ:

$week_start = strtotime('last Sunday', time());
$week_end = strtotime('next Sunday', time());

$month_start = strtotime('first day of this month', time());
$month_end = strtotime('last day of this month', time());

$year_start = strtotime('first day of January', time());
$year_end = strtotime('last day of December', time());

echo date('D, M jS Y', $week_start).'<br/>';
echo date('D, M jS Y', $week_end).'<br/>';

echo date('D, M jS Y', $month_start).'<br/>';
echo date('D, M jS Y', $month_end).'<br/>';

echo date('D, M jS Y', $year_start).'<br/>';
echo date('D, M jS Y', $year_end).'<br/>';

4
นี่เป็นวิธีที่เรียบร้อย แต่strtotime('first day of this month', time())จะกลับมาในวันแรกและเวลาเหมือนปัจจุบัน ดังนั้นจึงไม่ใช่วันแรกเวลา 0:00 น. เป็นวันแรกและเป็นเวลาแล้ว strtotime('first day of this month 00:00:00', time())การแก้ไขนี้
Kalle H. Väravas

22

ขณะนี้ฉันใช้โซลูชันนี้:

$firstDay = new \DateTime('first day of this month');
$lastDay = new \DateTime('last day of this month');

ปัญหาเดียวที่ฉันพบคือมีการตั้งเวลาแปลก ๆ ไว้ ฉันต้องการช่วงที่ถูกต้องสำหรับอินเทอร์เฟซการค้นหาของฉันและฉันก็พบสิ่งนี้:

$firstDay = new \DateTime('first day of this month 00:00:00');
$lastDay = new \DateTime('first day of next month 00:00:00');

นี่เจ๋ง แต่ฉันมีปัญหาในวันแรกของเดือนจริง ดังนั้นถ้าวันนี้เป็นวันที่ 1 กันยายนเวลา 11.00 น. ฉันจะได้รับ 1 สิงหาคม! ฉันต้องตรวจสอบว่ามันเป็น "วันที่ 1" วันนี้และถ้าเป็นเช่นนั้นใช้ "ตอนนี้" แปลก (Php 7.3.9)
Jacob Christensen

@JacobChristensen ยังไม่มีประสบการณ์นั้น คุณซ่อมมันอย่างไร
Nikola Petkanski

จริงมาก php ไม่ควรที่จะเจ๋งนักเกี่ยวกับเรื่องนี้เป็นครั้งแรกและครั้งสุดท้าย $ n = new \ DateTime ('วันแรกของ'. (ใหม่ \ DateTime ()) -> รูปแบบ ('F')); "วันแรกของเดือนมกราคม" เกิดขึ้นเหมือนกันทุกสัปดาห์เมื่อถึงวันจันทร์และมันก็น่าผิดหวังนิดหน่อย ...
Jacob Christensen

20

ฉันใช้วิธีที่บ้าคลั่งในการทำเช่นนี้โดยใช้คำสั่งนี้

$firstDay=date('Y-m-d',strtotime("first day of this month"));
$lastDay=date('Y-m-d',strtotime("last day of this month"));

นั่นคือทั้งหมด



4

น่าเกลียด (และไม่ได้ใช้วิธีการโทรของคุณด้านบน) แต่ใช้งานได้:

echo 'First day of the month: ' . date('m/d/y h:i a',(strtotime('this month',strtotime(date('m/01/y')))));   

ไม่อยู่ในหัวข้อ แต่คุณจะคำนวณวันสุดท้ายของเดือนอย่างไรในสถานการณ์เดียวกัน
LoneWOLFs

@ LoneWOLFs last day of {$month} {$year}หรือlast day of this monthทั้งสองทำงาน แต่โปรดจำไว้ว่า $ month จะต้องเป็นสตริงที่มีชื่อของเดือนเช่น "January" ตลอดทางที่คิดว่า "Decemember" date('Y-m-t');หรือคุณก็สามารถใช้
Mark Tomlin


3

ฉันใช้สิ่งนี้กับงาน cron รายวันเพื่อตรวจสอบว่าฉันควรส่งอีเมลในวันแรกของเดือนที่กำหนดไปยัง บริษัท ในเครือของฉันหรือไม่ มันเป็นสองสามบรรทัดมากกว่าคำตอบอื่น ๆ แต่แข็งเหมือนหิน

//is this the first day of the month?
$date = date('Y-m-d');
$pieces = explode("-", $date);
$day = $pieces[2];

//if it's not the first day then stop
if($day != "01") {

     echo "error - it's not the first of the month today";
     exit;

}

2

ใช้วิธีวันที่เราควรจะได้รับผลลัพธ์ เช่น; วันที่ ('N / D / l', mktime (0, 0, 0, เดือน, วัน, ปี));

ตัวอย่างเช่น

echo date('N', mktime(0, 0, 0, 7, 1, 2017));   // will return 6
echo date('D', mktime(0, 0, 0, 7, 1, 2017));   // will return Sat
echo date('l', mktime(0, 0, 0, 7, 1, 2017));   // will return Saturday

0

นิพจน์ php พิเศษทั้งหมดเหล่านั้นในจิตวิญญาณของ first day of ...ที่ดีแม้ว่าพวกเขาออกไปจากหัวของฉันครั้งแล้วครั้งเล่า

ดังนั้นฉันจึงตัดสินใจสร้าง abstractions พื้นฐานของ datetime สองสามตัวและการใช้งานเฉพาะจำนวนมากซึ่งอัตโนมัติโดย IDE ใด ๆ ประเด็นก็คือการค้นหาสิ่งที่ชนิดของสิ่งที่ ชอบtoday, now, the first day of a previous monthและอื่น ๆ ทั้งหมดของสิ่งเหล่านั้นฉันได้จดทะเบียนเป็น datetimes ดังนั้นจึงมีอินเตอร์เฟซหรือระดับนามธรรมที่เรียกว่าISO8601DateTimeและชุดข้อมูลเฉพาะที่ใช้มัน

รหัสในกรณีเฉพาะของคุณดูเหมือนว่า:

(new TheFirstDayOfThisMonth(new Now()))->value();

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

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