El primer día del mes actual en php usando date_modify como objeto DateTime

157

Puedo recibir el lunes de esta semana con:

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

Me gustaría llegar con la misma facilidad el 1 de este mes. ¿Cómo puedo lograr eso?

pihentagy
fuente
Uh, estoy en un apuro, John Conde respondió a la pregunta contesté, pero me olvido de mencionar, que tiene que trabajar en 5.2, así que voy a utilizar realmente la respuesta del Sr.-sk ...
pihentagy

Respuestas:

260

Requiere PHP 5.3 para funcionar ("primer día de" se introduce en PHP 5.3). De lo contrario, el ejemplo anterior es la única forma de hacerlo:

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

En PHP 5.4+ puedes hacer esto:

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

Si prefiere una forma concisa de hacerlo, y ya tiene el año y el mes en valores numéricos, puede 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
fuente
9
Tenga en cuenta que no tiene que pasar ->modify()si solo desea el primer día del mes actual . Puede pasar 'first day of this month'al constructor DateTime directamente como: $date = new DateTime('first day of this month'). Solo digo ...
Dzhuneyt
334

Esto es lo que uso.

Primer día del mes:

date('Y-m-01');

Último día del mes:

date('Y-m-t');
Etienne Dupuis
fuente
10
Esta es la OMI, con mucho, la forma más simple y legible de resolver esto, si todo lo que necesita es una representación de cadena de la fecha.
Markus Amalthea Magnuson
55
El último día del mes podría ser agarrado usando date('Y-m-t');.
Mark Tomlin
77
FYI: La fecha 't' en ('Ym-t') siempre representa el número de días en ese mismo mes. Una forma excelente y sencilla de obtener el último día del mes actual.
Pascal Klein
1
Si uso esto para tratar de obtener el día de la semana, date('w', '2015-05-01');entonces termino con el día anterior en lugar del día real. (Esto me daría 4 en lugar de los 5 correctos).
PBwebD
55
Esto es simplemente brillante. Lo $monthStart = date('Y-m-01 00:00:00'); $monthEnd = date('Y-m-t 23:59:59');
amplié
32

Esto es todo lo que necesitas:

$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
fuente
44
Esta es una solución ordenada, sin embargo strtotime('first day of this month', time()), regresará el primer día y la hora es la misma que la actual. Por lo tanto, no es el primer día a las 0:00 en punto, es el primer día y ahora es el momento. Esto lo arregla strtotime('first day of this month 00:00:00', time()).
Kalle H. Väravas
22

Actualmente estoy usando esta solución:

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

El único problema que encontré es que se está estableciendo un tiempo extraño. Necesitaba el rango correcto para nuestra interfaz de búsqueda y terminé con esto:

$firstDay = new \DateTime('first day of this month 00:00:00');
$lastDay = new \DateTime('first day of next month 00:00:00');
Nikola Petkanski
fuente
Esto es genial, pero tengo algunos problemas en el primer día del mes. Entonces, si hoy es el 1 de septiembre, 11am. ¡Llegaré el 1 de agosto! Necesito verificar si es el "1er" hoy y si es así, usar "ahora". raro (Php 7.3.9)
Jacob Christensen
@JacobChristensen aún no lo ha experimentado. ¿Cómo lo arreglaste?
Nikola Petkanski
Muy cierto, PHP parece no ser muy bueno con esto Primero y último. $ n = new \ DateTime ('primer día de'. (new \ DateTime ()) -> formato ('F')); "primer día de enero". Lo mismo sucede para la semana cuando es lunes y es un poco ... frustrante :)
Jacob Christensen
20

Utilizo una forma loca de hacer esto 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"));

Eso es todo

Jorge Ricardo Sanchez Cocunubo
fuente
6

En php 5.2 puedes usar:

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

Feo, (y no usa la llamada a su método anterior) pero funciona:

echo 'First day of the month: ' . date('m/d/y h:i a',(strtotime('this month',strtotime(date('m/01/y')))));   
señor-sk
fuente
fuera del tema, pero ¿cómo calcularía el último día del mes en el mismo escenario?
LoneWOLFs
@LoneWOLFs last day of {$month} {$year}o last day of this monthambos funcionan. Pero tenga en cuenta que $ month tendría que ser una cadena que contenga el nombre del mes como "enero", todo el tiempo pensado para "Decemember". O simplemente podrías usarlo date('Y-m-t');.
Mark Tomlin
3

Puedes hacerlo así:

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

Utilizo esto con un trabajo cron diario para verificar si debo enviar un correo electrónico el primer día de cualquier mes a mis afiliados. Son unas pocas líneas más que las otras respuestas pero sólidas como una roca.

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

utilizando el método de fecha, deberíamos poder obtener el resultado. es decir; fecha ('N / D / l', mktime (0, 0, 0, mes, día, año));

Por ejemplo

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

Todas esas expresiones php especiales, en espíritu de, first day of ...son geniales, aunque salen de mi cabeza una y otra vez.

Así que decidí construir un par de abstracciones básicas de fecha y hora y toneladas de implementación específica que cualquier IDE completa automáticamente. El punto es encontrar qué tipo de cosas. Al igual que, today, now, the first day of a previous month, etc. Todas esas cosas que he enumerado son datetimes. Por lo tanto, hay una interfaz o clase abstracta llamada ISO8601DateTime, y fechas específicas que la implementan.

El código en su caso particular se ve así:

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

Para obtener más información sobre este enfoque, eche un vistazo a esta entrada .

Vadim Samokhin
fuente