O primeiro dia do mês atual em php usando date_modify como objeto DateTime

157

Posso receber a segunda-feira desta semana com:

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

Gostaria de obter com a mesma facilidade o primeiro deste mês. Como posso conseguir isso?

pihentagy
fonte
Estou com um problema, John Conde respondeu à pergunta que respondi, mas esqueço de mencionar que ele precisa funcionar no 5.2, por isso vou usar a resposta do Mr-sk ...
pihentagy

Respostas:

260

Requer o PHP 5.3 para funcionar ("primeiro dia de" é introduzido no PHP 5.3). Caso contrário, o exemplo acima é a única maneira de fazer isso:

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

No PHP 5.4+, você pode fazer o seguinte:

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

Se você preferir uma maneira concisa de fazer isso, e já tiver o ano e o mês em valores numéricos, poderá usar 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
fonte
9
Observe que você não precisa passar ->modify()se quiser apenas o primeiro dia do mês atual . Você pode passar 'first day of this month'para o construtor DateTime diretamente como: $date = new DateTime('first day of this month'). Só
estou
333

Aqui está o que eu uso.

Primeiro dia do mês:

date('Y-m-01');

Último dia do mês:

date('Y-m-t');
Etienne Dupuis
fonte
10
Essa é a IMO, de longe, a maneira mais simples e legível de resolver isso, se tudo o que você precisa é uma representação em seqüência da data.
Markus Amalthea Magnuson
5
Último dia do mês, em seguida, pode ser agarrado usando date('Y-m-t');.
precisa
7
FYI: A data 't' ('Ym-t') sempre representa o número de dias naquele mesmo mês. Uma maneira excelente e simples de obter o último dia do mês atual.
Pascal Klein
1
Se eu usar isso para tentar obter o dia da semana date('w', '2015-05-01');, terminarei com o dia anterior em vez do dia real. (Isso me daria 4 em vez dos 5 corretos).
PBwebD 15/05
5
Isso é simplesmente brilhante. I expandiu-lo um pouco para dar o mínimo e limites máximos para o tempo no mês fazendo: $monthStart = date('Y-m-01 00:00:00'); $monthEnd = date('Y-m-t 23:59:59');
H2ONOCK
32

Isso é tudo que você precisa:

$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
fonte
4
Esta é uma solução elegante, no entanto strtotime('first day of this month', time()), retornará no primeiro dia e o horário é o mesmo que o atual. Portanto, não é o primeiro dia às 0:00, é o primeiro dia e como a hora é agora. Isso corrige isso strtotime('first day of this month 00:00:00', time()).
Kalle H. Väravas 01/09/14
22

Atualmente estou usando esta solução:

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

A única questão que me deparei é que está sendo definido um tempo estranho. Eu precisava do intervalo correto para nossa interface de pesquisa e acabei com isso:

$firstDay = new \DateTime('first day of this month 00:00:00');
$lastDay = new \DateTime('first day of next month 00:00:00');
Nikola Petkanski
fonte
Isso é legal, mas estou tendo alguns problemas no primeiro dia do mês. Então, se hoje é 1º de setembro, 11h. Eu vou chegar em 1º de agosto! Preciso verificar se é o "1º" hoje e, se for o caso, use "agora". estranho (Php 7.3.9)
Jacob Christensen
@JacobChristensen ainda não experimentou isso. Como você consertou isso?
Nikola Petkanski 8/10/19
Muito verdadeiro, o php parece não ser muito legal sobre este Primeiro e último. $ n = new \ DateTime ('primeiro dia de'. (new \ DateTime ()) -> formato ('F')); "primeiro dia de janeiro". O mesmo acontece na semana em que é segunda-feira e é um pouco ... frustrante :)
Jacob Christensen
20

Eu uso uma maneira louca de fazer isso é usando este comando

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

Isso é tudo

Jorge Ricardo Sanchez Cocunubo
fonte
6

No php 5.2, você pode usar:

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

Feio (e não usa sua chamada de método acima), mas funciona:

echo 'First day of the month: ' . date('m/d/y h:i a',(strtotime('this month',strtotime(date('m/01/y')))));   
sr-sk
fonte
fora do tópico, mas como você calcularia o último dia do mês no mesmo cenário.
LoneWOLFs
@LoneWOLFs last day of {$month} {$year}ou last day of this monthambos funcionam. Mas lembre-se de que $ month precisaria ser uma string que contenha o nome do mês como "janeiro" até o momento "dezembro". Ou você pode simplesmente usar date('Y-m-t');.
Mark Tomlin
3

Você pode fazer assim:

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

Eu uso isso com uma tarefa cron diária para verificar se devo enviar um email no primeiro dia de um mês para meus afiliados. São mais algumas linhas do que as outras respostas, mas sólidas como uma rocha.

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

usando o método date, poderemos obter o resultado. ie; data ('N / D / l', mktime (0, 0, 0, mês, dia, ano));

Por exemplo

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
fonte
0

Todas essas expressões especiais de php, no espírito de, first day of ...são ótimas, embora elas saiam da minha cabeça uma e outra vez.

Então, decidi criar algumas abstrações básicas de data e hora e toneladas de implementação específica que são concluídas automaticamente por qualquer IDE. O objetivo é encontrar o tipo de coisas. Como, today, now, the first day of a previous month, etc. Todas essas coisas que eu listei são datetimes. Portanto, há uma interface ou classe abstrata chamada ISO8601DateTimee datas específicas que a implementam.

O código no seu caso específico é assim:

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

Para saber mais sobre essa abordagem, consulte esta entrada .

Vadim Samokhin
fonte