Первый день текущего месяца в php с использованием date_modify в качестве объекта DateTime

157

Я могу получить понедельник этой недели с:

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

Я хотел бы получить с той же легкостью 1-го числа этого месяца. Как я могу этого достичь?

pihentagy
источник
Ну, у меня проблемы, Джон Конде ответил на вопрос, на который я ответил, но я забыл упомянуть, что он должен работать на 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'). Просто говорю ...
Джунейт
334

Вот что я использую.

Первый день месяца:

date('Y-m-01');

Последний день месяца:

date('Y-m-t');
Этьен Дюпюи
источник
10
Это IMO, безусловно, самый простой и читаемый способ решить эту проблему, если все, что вам нужно, это строковое представление даты.
Маркус Амальтея Магнусон
5
Последний день месяца может быть получен с помощью date('Y-m-t');.
Марк Томлин
7
К вашему сведению: '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');
задать
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/>';
kaleazy
источник
4
Это аккуратное решение, однако strtotime('first day of this month', time())вернется первый день, а время совпадает с текущим. Так что, это не первый день в 0:00, его первый день и, как сейчас, время. Это исправляет это strtotime('first day of this month 00:00:00', time()).
Калле Х. Варавас
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 ('первый день'. (new \ DateTime ()) -> формат ('F')); "первый день января". То же самое происходит в течение недели, когда это понедельник, и это немного ... расстраивает :)
Джейкоб Кристенсен
20

Я использую сумасшедший способ сделать это с помощью этой команды

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

Вот и все

Хорхе Рикардо Санчес Кокунубо
источник
6

В php 5.2 вы можете использовать:

<? $d = date_create();
print date_create($d->format('Y-m-1'))->format('Y-m-d') ?>
pihentagy
источник
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 должен быть строкой, содержащей название месяца, например «Январь», вплоть до «Decemember». Или вы могли бы просто использовать date('Y-m-t');.
Марк Томлин
3

Вы можете сделать это так:

$firstday = date_create()->modify('first day January 2010');
Томас
источник
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 ... великолепны, хотя они выходят из головы снова и снова.

Поэтому я решил создать пару базовых абстракций даты и времени и множество конкретных реализаций, которые автоматически выполняются любой IDE. Дело в том, чтобы найти что-то вроде вещей. Как, today, now, the first day of a previous monthи т.д. Все эти вещи я перечислил являются DateTimes. Следовательно, существует интерфейс или абстрактный классISO8601DateTime , и конкретные datetime, которые его реализуют.

Код в вашем конкретном случае выглядит так:

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

Чтобы узнать больше об этом подходе, взгляните на эту запись .

Вадим Самохин
источник