Ngày đầu tiên của tháng hiện tại bằng php sử dụng date_modify làm đối tượng DateTime


157

Tôi có thể nhận được thứ Hai của tuần này với:

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

Tôi muốn nhận được cùng một cách dễ dàng vào ngày đầu tiên của tháng này. Làm thế nào tôi có thể đạt được điều đó?


Uh, tôi đang gặp rắc rối, John Conde đã trả lời câu hỏi tôi đã trả lời, nhưng tôi quên đề cập rằng nó cần phải hoạt động vào ngày 5.2, vì vậy tôi sẽ thực sự sử dụng câu trả lời của Mr-sk ...
pieaveragy

Câu trả lời:


260

Yêu cầu PHP 5.3 hoạt động ("ngày đầu tiên" được giới thiệu trong PHP 5.3). Mặt khác, ví dụ trên là cách duy nhất để làm điều đó:

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

Trong PHP 5.4+ bạn có thể làm điều này:

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

Nếu bạn thích một cách ngắn gọn để làm điều này và đã có năm và tháng theo các giá trị số, bạn có thể sử dụng 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
Lưu ý rằng bạn không phải trải qua ->modify()nếu bạn chỉ muốn ngày đầu tiên của tháng hiện tại . Bạn có thể chuyển 'first day of this month'trực tiếp đến hàm tạo DateTime như : $date = new DateTime('first day of this month'). Chỉ cần nói ...
Dzhuneyt

333

Đây là những gì tôi sử dụng.

Ngày đầu tiên của tháng:

date('Y-m-01');

Ngày cuối cùng của tháng:

date('Y-m-t');

10
Đây là IMO cho đến nay là cách đơn giản nhất và dễ đọc nhất để giải quyết vấn đề này, nếu tất cả những gì bạn cần là một chuỗi đại diện cho ngày.
Markus Amalthea Magnuson

5
Ngày cuối cùng của tháng sau đó có thể được lấy bằng cách sử dụng date('Y-m-t');.
Đánh dấu Tomlin

7
FYI: 't' in date ('Ym-t') luôn đại diện cho số ngày trong chính tháng đó. Một cách tuyệt vời và đơn giản để có được ngày cuối cùng của tháng hiện tại.
Pascal Klein

1
Nếu tôi sử dụng điều này để cố gắng có được ngày trong tuần date('w', '2015-05-01');thì tôi kết thúc với ngày trước thay vì ngày thực tế. (Điều này sẽ cho tôi 4 thay vì 5 đúng).
PBwebD

5
Điều này chỉ đơn giản là rực rỡ. Tôi đã mở rộng trên đó một chút để đưa ra ranh giới tối thiểu và tối đa cho thời gian trong tháng bằng cách thực hiện: $monthStart = date('Y-m-01 00:00:00'); $monthEnd = date('Y-m-t 23:59:59');
H2ONOCK

32

Đây là mọi thứ bạn cần:

$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
Đây là một giải pháp gọn gàng, tuy nhiên strtotime('first day of this month', time())sẽ trở lại vào ngày đầu tiên và thời gian giống như hiện tại. Vì vậy, đây không phải là ngày đầu tiên lúc 0:00 giờ, ngày đầu tiên và như thời điểm hiện tại. Điều này sửa nó strtotime('first day of this month 00:00:00', time()).
Kalle H. Väravas

22

Hiện tại tôi đang sử dụng giải pháp này:

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

Vấn đề duy nhất tôi gặp phải là thời gian kỳ lạ đang được thiết lập. Tôi cần phạm vi chính xác cho giao diện tìm kiếm của chúng tôi và tôi đã kết thúc với điều này:

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

Điều này thật tuyệt, nhưng tôi gặp một số vấn đề vào ngày đầu tiên thực sự của tháng. Vì vậy, nếu hôm nay là ngày 1 tháng 9, 11 giờ sáng. Tôi sẽ nhận được ngày 1 tháng 8! Tôi cần phải thực sự kiểm tra xem hôm nay có phải là "số 1" không và nếu có thì hãy sử dụng "ngay bây giờ". kỳ lạ (Php 7.3.9)
Jacob Christensen

@JacobChristensen chưa có kinh nghiệm đó. Làm thế nào bạn sửa nó?
Nikola Petkanski

Rất đúng, các đường nối php không được tuyệt vời về điều này đầu tiên và cuối cùng. $ n = new \ DateTime ('ngày đầu tiên của'. (new \ DateTime ()) -> định dạng ('F')); "ngày đầu tiên của tháng một". Điều tương tự cũng xảy ra trong tuần khi đó là thứ Hai và hơi ... bực bội :)
Jacob Christensen

20

Tôi sử dụng một cách điên rồ để làm điều này là sử dụng lệnh này

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

Đó là tất cả


6

Trong php 5.2 bạn có thể sử dụng:

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

4

Xấu xí, (và không sử dụng phương thức gọi của bạn ở trên) nhưng hoạt động:

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

ngoài chủ đề nhưng làm thế nào bạn sẽ tính ngày cuối cùng của tháng theo cùng một kịch bản.
LoneWOLFs

@LoneWOLFs last day of {$month} {$year}hoặc last day of this monthcả hai đều hoạt động. Nhưng hãy nhớ rằng $ tháng sẽ phải là một chuỗi chứa tên của tháng như "tháng một" theo cách nghĩ đến "tháng mười hai". Hoặc bạn chỉ có thể sử dụng date('Y-m-t');.
Đánh dấu Tomlin

3

Bạn có thể làm như thế này:

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

3

Tôi sử dụng công việc này với công việc định kỳ hàng ngày để kiểm tra xem tôi có nên gửi email vào ngày đầu tiên của bất kỳ tháng nào cho các chi nhánh của mình không. Đó là một vài dòng hơn các câu trả lời khác nhưng rắn như đá.

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

sử dụng phương pháp ngày, chúng ta sẽ có thể nhận được kết quả. I E; ngày ('N / D / l', mktime (0, 0, 0, tháng, ngày, năm));

Ví dụ

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

Tất cả những biểu hiện php đặc biệt, trên tinh thần first day of ... là tuyệt vời, mặc dù chúng hết lần này đến lần khác.

Vì vậy, tôi quyết định xây dựng một vài bản tóm tắt datetime cơ bản và hàng tấn thực hiện cụ thể được tự động hoàn thành bởi bất kỳ IDE nào. Vấn đề là tìm những gì - nhân loại của sự vật. Giống như, today, now, the first day of a previous month, vv Tất cả những điều đó tôi đã liệt kê datetimes. Do đó, có một giao diện hoặc lớp trừu tượng được gọi làISO8601DateTime và các mốc thời gian cụ thể thực hiện nó.

Mã trong trường hợp cụ thể của bạn trông như thế:

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

Để biết thêm về phương pháp này, hãy xem mục này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.