Le premier jour du mois en cours en php en utilisant date_modify comme objet DateTime

157

Je peux recevoir le lundi de cette semaine avec:

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

J'aimerais obtenir avec la même facilité le 1er de ce mois. Comment puis-je y parvenir?

pihentagy
la source
Euh, j'ai un problème, John Conde a répondu à la question à laquelle j'ai répondu, mais j'oublie de mentionner, qu'il doit fonctionner sur 5.2, donc j'utiliserai la réponse de Mr-sk ...
pihentagy

Réponses:

260

Nécessite PHP 5.3 pour fonctionner ("premier jour de" est introduit dans PHP 5.3). Sinon, l'exemple ci-dessus est le seul moyen de le faire:

<?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+, vous pouvez faire ceci:

<?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 vous préférez une manière concise de le faire et que vous avez déjà l'année et le mois en valeurs numériques, vous pouvez utiliser 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
la source
9
Notez que vous n'êtes pas obligé de passer ->modify()si vous voulez juste le premier jour du mois en cours . Vous pouvez passer 'first day of this month'au constructeur DateTime directement comme: $date = new DateTime('first day of this month'). Juste en disant ...
Dzhuneyt
334

Voici ce que j'utilise.

Premier jour du mois:

date('Y-m-01');

Dernier jour du mois:

date('Y-m-t');
Etienne Dupuis
la source
10
C'est IMO de loin le moyen le plus simple et le plus lisible de résoudre ce problème, si tout ce dont vous avez besoin est une représentation sous forme de chaîne de la date.
Markus Amalthea Magnuson
5
Le dernier jour du mois pourrait alors être saisi en utilisant date('Y-m-t');.
Mark Tomlin
7
FYI: La date «t» («Ym-t») représente toujours le nombre de jours dans ce même mois. Un moyen simple et efficace d'obtenir le dernier jour du mois en cours.
Pascal Klein
1
Si j'utilise ceci pour essayer d'obtenir le jour de la semaine, date('w', '2015-05-01');je me retrouve avec la veille au lieu du jour réel. (Cela me donnerait 4 au lieu des 5 corrects).
PBwebD
5
C'est tout simplement génial. Je l'ai développé un peu pour donner les limites min et max pour le temps du mois en faisant: $monthStart = date('Y-m-01 00:00:00'); $monthEnd = date('Y-m-t 23:59:59');
H2ONOCK
32

Voici tout ce dont vous avez besoin:

$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
la source
4
Ceci est une solution soignée, mais strtotime('first day of this month', time())reviendra le premier jour, et l'heure est la même que celle actuelle. Donc là pour, ce n'est pas le premier jour à 0h00, son premier jour et comme l'heure est maintenant. Cela le corrige strtotime('first day of this month 00:00:00', time()).
Kalle H. Väravas
22

J'utilise actuellement cette solution:

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

Le seul problème que je suis tombé sur est que le temps étrange est fixé. J'avais besoin d'une plage correcte pour notre interface de recherche et je me suis retrouvé avec ceci:

$firstDay = new \DateTime('first day of this month 00:00:00');
$lastDay = new \DateTime('first day of next month 00:00:00');
Nikola Petkanski
la source
C'est cool, mais j'ai quelques problèmes le premier jour du mois. Donc, si aujourd'hui c'est le 1er septembre, 11h. J'aurai le 1er août! J'ai besoin de vérifier si c'est le "1er" aujourd'hui et si c'est le cas, utilisez "maintenant". bizarre (Php 7.3.9)
Jacob Christensen
@JacobChristensen n'a pas encore vécu cela. Comment l'avez-vous résolu?
Nikola Petkanski
Très vrai, php ne semble pas être très cool à propos de ce premier et dernier. $ n = new \ DateTime ('premier jour de'. (new \ DateTime ()) -> format ('F')); "premier jour de janvier". Même chose pour la semaine où c'est lundi et c'est un peu ... frustrant :)
Jacob Christensen le
20

J'utilise une façon folle de faire cela en utilisant cette commande

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

C'est tout

Jorge Ricardo Sanchez Cocunubo
la source
6

En php 5.2, vous pouvez utiliser:

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

Moche, (et n'utilise pas votre appel de méthode ci-dessus) mais fonctionne:

echo 'First day of the month: ' . date('m/d/y h:i a',(strtotime('this month',strtotime(date('m/01/y')))));   
mr-sk
la source
hors du sujet mais comment calculeriez-vous le dernier jour du mois dans le même scénario.
LoneWOLFs
@LoneWOLFs last day of {$month} {$year}ou les last day of this monthdeux fonctionnent. Mais gardez à l'esprit que $ month devrait être une chaîne contenant le nom du mois comme «janvier», pensé à «décembre». Ou vous pouvez simplement utiliser date('Y-m-t');.
Mark Tomlin
3

Vous pouvez le faire comme ceci:

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

Je l'utilise avec un travail cron quotidien pour vérifier si je dois envoyer un e-mail le premier jour d'un mois donné à mes affiliés. C'est quelques lignes de plus que les autres réponses mais solide comme un roc.

//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
la source
2

en utilisant la méthode de la date, nous devrions être en mesure d'obtenir le résultat. c'est à dire; date ('N / D / l', mktime (0, 0, 0, mois, jour, année));

Par exemple

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
la source
0

Toutes ces expressions php spéciales, dans l'esprit de first day of ...sont géniales, même si elles me sortent de la tête à maintes reprises.

J'ai donc décidé de créer quelques abstractions de base de datetime et des tonnes d'implémentations spécifiques qui sont automatiquement complétées par n'importe quel IDE. Le but est de trouver quel genre de choses. Comme, today, now, the first day of a previous month, etc. Toutes ces choses que j'ai énumérés sont datetimes. Par conséquent, il existe une interface ou une classe abstraite appeléeISO8601DateTime , et des datetimes spécifiques qui l'implémentent.

Le code dans votre cas particulier ressemble à ça:

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

Pour plus d'informations sur cette approche, consultez cette entrée .

Vadim Samokhin
la source