Перший день поточного місяця в php, використовуючи date_modify як об’єкт DateTime


157

Я можу отримати понеділок цього тижня за допомогою:

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

Я б хотів з такою ж легкістю отримати 1-го числа цього місяця. Як я можу цього досягти?


А, я в біді, Джон Конде відповів на запитання, на яке я відповів, але я забуваю зазначити, що над цим потрібно працювати 5,2, тому я фактично використовую відповідь пана
Ск

Відповіді:


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'). Просто кажу ...
Джунейт

334

Ось що я використовую.

Перший день місяця:

date('Y-m-01');

Останній день місяця:

date('Y-m-t');

10
Це IMO - це найпростіший і найчитабельніший спосіб вирішити це питання, якщо все, що вам потрібно, - це рядкове подання дати.
Маркус Амальтея Магнусон

5
Останній день місяця потім можна було схопити за допомогою date('Y-m-t');.
Марк Томлін

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 ранку. Я отримаю 1 серпня! Мені потрібно фактично перевірити, чи це сьогодні "1-е", і якщо так, то "зараз". дивно (Php 7.3.9)
Якоб Крістенсен

@JacobChristensen ще цього не відчував. Як ви це виправили?
Микола Петканський

Дуже вірно, php-шви не дуже круті щодо цього Першого та останнього. $ n = new \ DateTime ('перший день'. (новий \ DateTime ()) -> формат ('F')); "перший день січня". Те саме відбувається і на Тижні, коли понеділок, і це трохи ... засмучує :)
Якоб Крістенсен,


6

У php 5.2 ви можете використовувати:

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

4

Некрасиво (і не використовує ваш метод виклику вище), але працює:

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

поза темою, але як би ви обчислили останній день місяця за тим же сценарієм.
LoneWOLFs

@LoneWOLF last day of {$month} {$year}або last day of this monthобидва працюють. Але майте на увазі, що $ month має бути рядком, що містить назву місяця, наприклад, "січень" весь шлях, який вважається "Decemember". Або ви могли просто використовувати date('Y-m-t');.
Марк Томлін

3

Ви можете це зробити так:

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

3

Я використовую це за допомогою щоденної роботи з клоном, щоб перевірити, чи варто мені надсилати електронний лист у перший день будь-якого місяця своїм філіям. Це на кілька більше рядків, ніж інші відповіді, але твердий, як скеля.

//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 ..., чудові, хоча вони виходять з моєї голови раз і знову.

Тому я вирішив створити пару основних абстракцій за датою та тонни конкретної реалізації, які автоматично завершуються будь-якими IDE. Сенс у тому, щоб знайти те, що - речі. Як, today, now, the first day of a previous monthі т.д. Всі ці речі я перерахував є DateTimes. Отже, є інтерфейс або абстрактний клас, який називається ISO8601DateTime, і конкретні дати, які його реалізують.

Код у вашому конкретному випадку виглядає так:

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

Щоб дізнатися більше про цей підхід, подивіться цей запис .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.