Hari pertama bulan berjalan di php menggunakan date_modify sebagai objek DateTime

157

Saya bisa mendapatkan hari Senin minggu ini dengan:

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

Saya ingin mendapatkan kemudahan yang sama tanggal 1 bulan ini. Bagaimana saya bisa mencapainya?

pihentagy
sumber
Eh, saya dalam masalah, John Conde menjawab pertanyaan yang saya jawab, tetapi saya lupa menyebutkan, bahwa itu perlu bekerja pada 5.2, jadi saya benar-benar akan menggunakan jawaban Mr-sk ...
pihentagy

Jawaban:

260

Membutuhkan PHP 5.3 untuk bekerja ("hari pertama" diperkenalkan di PHP 5.3). Kalau tidak, contoh di atas adalah satu-satunya cara untuk melakukannya:

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

Di PHP 5.4+ Anda dapat melakukan ini:

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

Jika Anda lebih suka cara ringkas untuk melakukan ini, dan sudah memiliki tahun dan bulan dalam nilai numerik, Anda dapat menggunakan 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
John Conde
sumber
9
Perhatikan bahwa Anda tidak harus melewati ->modify()jika Anda hanya ingin hari pertama bulan ini . Anda dapat melewati 'first day of this month'ke konstruktor DateTime langsung seperti: $date = new DateTime('first day of this month'). Hanya mengatakan ...
Dzhuneyt
334

Inilah yang saya gunakan.

Hari pertama bulan ini:

date('Y-m-01');

Hari terakhir bulan ini:

date('Y-m-t');
Etienne Dupuis
sumber
10
Sejauh ini IMO adalah cara paling sederhana dan paling mudah dibaca untuk menyelesaikan masalah ini, jika yang Anda butuhkan hanyalah representasi string dari tanggal tersebut.
Markus Amalthea Magnuson
5
Hari terakhir bulan itu bisa diambil dengan menggunakan date('Y-m-t');.
Mark Tomlin
7
FYI: 't' in date ('Ym-t') selalu mewakili jumlah hari dalam bulan itu. Cara hebat dan sederhana untuk mendapatkan hari terakhir bulan ini.
Pascal Klein
1
Jika saya menggunakan ini untuk mencoba mendapatkan hari dalam seminggu date('w', '2015-05-01');maka saya berakhir dengan hari sebelumnya, bukan hari yang sebenarnya. (Ini akan memberi saya 4 bukannya 5 yang benar).
PBwebD
5
Ini sangat brilian. Saya memperluas sedikit untuk memberikan batas min dan max untuk waktu di bulan dengan melakukan: $monthStart = date('Y-m-01 00:00:00'); $monthEnd = date('Y-m-t 23:59:59');
H2ONOCK
32

Ini semua yang Anda butuhkan:

$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/>';
kaleazy
sumber
4
Ini adalah solusi yang rapi, namun strtotime('first day of this month', time())akan kembali pada hari pertama, dan waktunya sama dengan saat ini. Jadi begitulah, ini bukan hari pertama jam 0:00, hari pertama dan seperti sekarang. Ini memperbaikinya strtotime('first day of this month 00:00:00', time()).
Kalle H. Väravas
22

Saat ini saya menggunakan solusi ini:

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

Satu-satunya masalah yang saya temukan adalah bahwa waktu aneh sedang diatur. Saya membutuhkan rentang yang benar untuk antarmuka pencarian kami dan saya berakhir dengan ini:

$firstDay = new \DateTime('first day of this month 00:00:00');
$lastDay = new \DateTime('first day of next month 00:00:00');
Nikola Petkanski
sumber
Ini keren, tapi saya mengalami beberapa masalah pada hari pertama bulan itu. Jadi, jika hari ini adalah 1 September, 11 pagi. Saya akan mendapatkan 1 Agustus! Saya harus benar-benar memeriksa apakah ini "1" hari ini dan jika demikian gunakan "sekarang". aneh (Php 7.3.9)
Jacob Christensen
@ JacobChristensen belum mengalaminya. Bagaimana Anda memperbaikinya?
Nikola Petkanski
Sangat benar, php tidak terlalu keren tentang ini. Pertama dan terakhir. $ n = new \ DateTime ('hari pertama'. (new \ DateTime ()) -> format ('F')); "hari pertama Januari". Hal yang sama terjadi pada Minggu ketika hari Senin dan sedikit ... membuat frustrasi :)
Jacob Christensen
20

Saya menggunakan cara gila untuk melakukan ini menggunakan perintah ini

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

Itu saja

Jorge Ricardo Sanchez Cocunubo
sumber
6

Di php 5.2 Anda dapat menggunakan:

<? $d = date_create();
print date_create($d->format('Y-m-1'))->format('Y-m-d') ?>
pihentagy
sumber
4

Jelek, (dan tidak menggunakan pemanggilan metode Anda di atas) tetapi berfungsi:

echo 'First day of the month: ' . date('m/d/y h:i a',(strtotime('this month',strtotime(date('m/01/y')))));   
mr-sk
sumber
keluar dari topik tetapi bagaimana Anda menghitung hari terakhir bulan itu dalam skenario yang sama.
LoneWOLFs
@LoneWOLFs last day of {$month} {$year}atau last day of this monthkeduanya berfungsi. Tetapi perlu diingat bahwa $ month harus berupa string yang berisi nama bulan seperti "Januari" yang dianggap "Desemember". Atau Anda bisa menggunakannya date('Y-m-t');.
Mark Tomlin
3

Anda dapat melakukannya seperti ini:

$firstday = date_create()->modify('first day January 2010');
Thomas
sumber
3

Saya menggunakan ini dengan pekerjaan cron harian untuk memeriksa apakah saya harus mengirim email pada hari pertama setiap bulan ke afiliasi saya. Itu beberapa baris lebih dari jawaban lain tetapi padat seperti batu.

//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;

}
Craig Edmonds
sumber
2

menggunakan metode tanggal, kita harus bisa mendapatkan hasilnya. yaitu; tanggal ('N / D / l', mktime (0, 0, 0, bulan, hari, tahun));

Sebagai contoh

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
Jacob Nelson
sumber
0

Semua ekspresi php khusus itu, dalam semangat first day of ...yang besar, meskipun mereka keluar dari kepala saya berkali-kali.

Jadi saya memutuskan untuk membangun beberapa abstraksi datetime dasar dan banyak implementasi spesifik yang secara otomatis dilengkapi oleh setiap IDE. Intinya adalah menemukan apa -baiknya. Seperti, today, now, the first day of a previous month, dll Semua hal-hal saya sudah tercantum adalah datetimes. Oleh karena itu, ada antarmuka atau kelas abstrak yang disebutISO8601DateTime , dan datetimes spesifik yang mengimplementasikannya.

Kode dalam kasus khusus Anda terlihat seperti itu:

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

Untuk lebih lanjut tentang pendekatan ini, lihat entri ini .

Vadim Samokhin
sumber