web-dev-qa-db-fra.com

Comment obtenir le premier et le dernier jour du mois précédent avec Carbon - Laravel

J'ai besoin de First et Last Day de mois précédent en utilisant Carbon Library, ce que j'ai essayé est la suivante:

$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateString();
$lastDayofPreviousMonth = Carbon::now()->endOfMonth()->subMonth()->toDateString();

Résultat je reçois is for$firstDayofPreviousMonth = '2016-04-01' (le mois en cours étant le 5 mai) et pour $lastDayofPreviousMonth = '2016-05-01'.

J'obtiens un résultat correct pour $firstDayofPreviousMonth, mais cela me donne le résultat précédent 30 jours et me donne un résultat erroné pour $lastDayofPreviousMonth.

Est-ce que quelqu'un pourrait m'aider avec ceci?

31
Siddharth

Essaye ça:

$start = new Carbon('first day of last month');
$end = new Carbon('last day of last month');
47
Deniz B.

Juste essayer ceci

$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateString(); $lastDayofPreviousMonth = Carbon::now()->subMonth()->endOfMonth()->toDateString();

34
Abu Sayem

Avec cela ... la date commence à 00:00 et se termine à 23:59

$start = new Carbon('first day of last month');
$start->startOfMonth();
$end = new Carbon('last day of last month');
$end->endOfMonth();
9
sadalsuud

Pour répondre spécifiquement à votre question quant à la raison pour laquelle vous obtenez un résultat erroné pour $lastDayofPreviousMonth.

Décrivons cette affirmation dans votre exemple:

Carbon::now()->endOfMonth()->subMonth()->toDateString();
// Carbon::now() > 2016-05-05
// ->endOfMonth() > 2016-05-31
// ->subMonth() > 2016-04-31 // Simply takes 1 away from 5.

Cela nous laisse avec une date invalide - il n'y a pas de 31 avril. Le jour supplémentaire est simplement ajouté à la dernière date valide (2016-04-30 + 1) qui reporte la date à mai (2016-05-01).

Comme indiqué précédemment, pour vous assurer que cela ne se produit jamais, réglez toujours la date au 1er du mois avant de faire quoi que ce soit (chaque mois ayant un 1er jour).

$lastDayofPreviousMonth = Carbon::now()->startofMonth()->subMonth()->endOfMonth()->toDateString();
// Carbon::now() > 2016-05-05
// ->startofMonth() > 2016-05-01 00:00:00
// ->subMonth() > 2016-04-01 00:00:00
// ->endOfMonth() > 2016-04-30 23:59:59
8
Tama

Il y a actuellement un bug dans Carbon lors de l'utilisation de la méthode

Carbon::now()->startOfMonth()->subMonth()->endOfMonth()->toDateTimeString();

Le bogue entraîne le retour du dernier jour à 30 pour les mois de 31 jours.

En d'autres termes, si vous êtes en mars et que vous exécutez l'appel ci-dessus, il retournera le 2017-03-30 et non le 2017-03-31 comme prévu.

Comme je faisais une opération entre les dates, j'ai fini par utiliser ..

Carbon::now()->startOfMonth()->subSeconds(1)->toDateTimeString();

Cela s'est terminé avec la date correcte dateTimeString pour les jours se terminant le 31.

3
FuzzyJared