web-dev-qa-db-fra.com

Comment comparer deux horodatages de carbone?

J'ai deux horodatages, edited_at que j'ai créé et created_at (Laravel's) ... Dans la base de données, les deux ont le type timestamp et la valeur par défaut 0000-00-00 00:00:00 ... Mais

var_dump(edited_at variable) donne une chaîne. Alors que var_dump(created_at variable) est objet/Carbon. Quel est le problème avec ces horodatages?

Je dois comparer les deux après la conversion en entier en utilisant le format ('U'). Je ne peux appeler cette méthode que sur Carbon Object. Comment puis je faire ça?

51
Hassan Saqib

Tout d'abord, Eloquent convertit automatiquement ses horodatages (created_at, updated_at) En objets carbone. Vous pouvez simplement utiliser updated_at Pour obtenir cette fonctionnalité Nice ou spécifier edited_at Dans votre modèle dans la propriété $dates:

protected $dates = ['edited_at'];

Revenons maintenant à votre question actuelle. Carbon a beaucoup de fonctions de comparaison:

  • eq() est égal à
  • ne() pas égal
  • gt() supérieur à
  • gte() supérieur ou égal à
  • lt() moins que
  • lte() inférieur ou égal à

Usage:

if($model->edited_at->gt($model->created_at)){
    // edited at is newer than created at
}
127
lukasgeiter

Carbon a un tas de fonctions de comparaison avec des noms mnémoniques:

  • égal à()
  • pas égal à()
  • plus grand que()
  • plus grand ou égal à()
  • moins que()
  • inférieur ou égal à()

Usage:

 if($model->edited_at->greaterThan($model->created_at)){
     // edited at is newer than created at
 }

Valable pour nesbot/carbon 1.36.2

si vous ne savez pas quelle version de Carbon vous utilisez, lancez cette commande.

$composer show "nesbot/carbon"
4
Yevgeniy Afanasyev

Commencez par convertir l’horodatage en utilisant la fonctionnalité éloquente intégrée, comme décrit dans cette réponse .

Ensuite, vous pouvez simplement utiliser la fonction min() ou max() de Carbon pour la comparaison. Par exemple:

$dt1 = Carbon::create(2012, 1, 1, 0, 0, 0); $dt2 = Carbon::create(2014, 1, 30, 0, 0, 0); echo $dt1->min($dt2);

Ceci sera echo la moindre des deux dates, qui dans ce cas est $dt1.

Voir http://carbon.nesbot.com/docs/

1
ginna

étendant sur @lukasgeiter answer, les méthodes eq(), ne(), gt(), gte(), lt(), lte() ne fait pas que comparer le day mais il se penche également sur le time et le timezone

>> $date->toArray();

{
  "year": 2019,
  "month": 2,
  "day": 23,
  "dayOfWeek": 6,
  "dayOfYear": 53,
  "hour": 7,
  "minute": 39,
  "second": 52,
  "micro": 849616,
  "timestamp": 1550907592,
  "formatted": "2019-02-23 07:39:52",
  "timezone": {
    "timezone_type": 3,
    "timezone": "UTC"
  }
}

Le fuseau horaire peut être réglé comme suit: Carbon::parse($stringDate, new DateTimeZone('Asia/Dubai'))

pour ne comparer que le jour

$date1->startOfDay()->eq($date2->startOfDay())

je ne pouvais pas utiliser ces méthodes, j'espère que cela aidera quelqu'un d'autre.

0
fayz