Maison  >  Article  >  développement back-end  >  Introduction détaillée à l'utilisation de la classe de traitement du temps Carbon en PHP

Introduction détaillée à l'utilisation de la classe de traitement du temps Carbon en PHP

WBOY
WBOYavant
2022-07-28 15:46:075229parcourir

Cet article vous présente principalement les connaissances pertinentes sur PHP. Carbon est la bibliothèque de traitement de dates de PHP (une simple extension d'API PHP pour DateTime.), qui hérite de la classe Datetime de PHP, j'espère. aide tout le monde.

Introduction détaillée à l'utilisation de la classe de traitement du temps Carbon en PHP

(Tutoriel recommandé : Tutoriel vidéo PHP)

1 Introduction

Carbon est une bibliothèque de traitement de dates pour php (une simple extension d'API PHP pour DateTime.).

Carbon hérite de la classe Datetime de PHP, donc toutes les méthodes qui ne sont pas impliquées dans Carbon mais qui ont été implémentées dans Datetime peuvent être utilisées.

Regardez le code

<?php
namespace Carbon;
 
class Carbon extends \DateTime
{
    // code here
}

La classe Carbon est déclarée sous l'espace de noms Carbon Vous pouvez introduire l'espace de noms au lieu de saisir le nom complet de la classe à chaque fois.

<?php
use Carbon\Carbon;

Remarque : Si vous ne définissez pas spécifiquement le fuseau horaire lors de l'utilisation de Carbon, le fuseau horaire Amérique/Toronto sera utilisé par défaut.

Faites particulièrement attention à savoir si le fuseau horaire correct est utilisé. Par exemple, toutes les comparaisons de différences dans Carbon utilisent UTC ou le fuseau horaire défini par le système.

<?php
$dtToronto = Carbon::createFromDate(2012, 1, 1, &#39;America/Toronto&#39;);
$dtVancouver = Carbon::createFromDate(2012, 1, 1, &#39;America/Vancouver&#39;);
 
echo $dtVancouver->diffInHours($dtToronto); // 3

Les comparaisons de temps effectuées ci-dessus ont été effectuées dans le fuseau horaire de l'instance Carbon fournie. Par exemple, le fuseau horaire de l'auteur est l'heure de Tokyo moins 13 heures, donc après 13 heures. Carbon::now('Asia/Tokyo')->isToday() renverra false Si le fuseau horaire est défini sur le fuseau horaire de Tokyo lors de l'appel de now(), il n'est pas raisonnable d'utiliser le fuseau horaire de Tokyo pour les opérations ultérieures. Ainsi, lorsque l'on compare à une instance créée par now(), la valeur par défaut est celle du fuseau horaire actuel.

2.Instantiation

Il existe plusieurs façons de créer une instance de Carbon, mais tout le monde devrait préférer l'implémenter via cette méthode sémantique statique.

<?php
$carbon = new Carbon();                  // equivalent to Carbon::now()
$carbon = new Carbon(&#39;first day of January 2008&#39;, &#39;America/Vancouver&#39;);
echo get_class($carbon);                 // &#39;Carbon\Carbon&#39;
$carbon = Carbon::now(-5);

Il convient de noter que le deuxième paramètre du constructeur Carbon a été amélioré pour être non seulement une instance DateTimeZone, mais également une chaîne ou un entier (représentant une valeur de décalage par rapport à GMT). Prenons un exemple pour illustrer la méthode now().

<?php
$now = Carbon::now();
 
$nowInLondonTz = Carbon::now(new DateTimeZone(&#39;Europe/London&#39;));
 
// or just pass the timezone as a string
$nowInLondonTz = Carbon::now(&#39;Europe/London&#39;);
 
// or to create a date with a timezone of +1 to GMT during DST then just pass an integer
echo Carbon::now(1)->tzName;             // Europe/London

Vous aimerez utiliser la méthode parse() pour remplacer la méthode de construction lourde d'origine

<?php
echo (new Carbon(&#39;first day of December 2008&#39;))->addWeeks(2);     // 2008-12-15 00:00:00
echo Carbon::parse(&#39;first day of December 2008&#39;)->addWeeks(2);    // 2008-12-15 00:00:00

Les méthodes comme now() qui renvoient directement les instances Carbon incluent aujourd'hui(), demain(), hier(), elles acceptent toutes un fuseau horaire type, et la partie temporelle du résultat final est 00:00:00

<?php
$now = Carbon::now();
echo $now;                               // 2016-06-24 15:18:34
$today = Carbon::today();
echo $today;                             // 2016-06-24 00:00:00
$tomorrow = Carbon::tomorrow(&#39;Europe/London&#39;);
echo $tomorrow;                          // 2016-06-25 00:00:00
$yesterday = Carbon::yesterday();
echo $yesterday;                         // 2016-06-23 00:00:00

Voici quelques autres méthodes statiques sous la forme de creatXXX(). Les paramètres de la plupart des méthodes statiques peuvent être transmis ou non. S'ils ne sont pas transmis, les valeurs par défaut prédéfinies par la méthode seront utilisées. Ces valeurs prédéfinies sont généralement basées sur la date, l'heure et le fuseau horaire actuels. Si un paramètre requis n'est pas transmis, une exception de type InvalidArgumentException sera levée. Utilisez la méthode DateTime::getLastErrors() pour obtenir les détails de l'exception.

<?php
Carbon::createFromDate($year, $month, $day, $tz);
Carbon::createFromTime($hour, $minute, $second, $tz);
Carbon::create($year, $month, $day, $hour, $minute, $second, $tz);

createFromDate() renvoie l'heure actuelle par défaut et la date createFromTime() est par défaut celle d'aujourd'hui. Tous les paramètres nuls de crete() prendront par défaut l'heure correspondante actuelle. De même, le fuseau horaire est par défaut le fuseau horaire actuel. Si seules les heures sont définies mais pas les minutes et les secondes, les minutes et les secondes sont par défaut 0

<?php
$xmasThisYear = Carbon::createFromDate(null, 12, 25);  // Year defaults to current year
$Y2K = Carbon::create(2000, 1, 1, 0, 0, 0);
$alsoY2K = Carbon::create(1999, 12, 31, 24);
$noonLondonTz = Carbon::createFromTime(12, 0, 0, &#39;Europe/London&#39;);
 
// A two digit minute could not be found
try { 
    Carbon::create(1975, 5, 21, 22, -2, 0); 
} catch(InvalidArgumentException $x) { 
    echo $x->getMessage(); 
}
<?php
Carbon::createFromFormat($format, $time, $tz);

createFromFormat() et DateTime::createFromFormat de PHP. La différence est que le paramètre $dt peut être une instance de DateTImeZone ou une chaîne de fuseau horaire. Et il peut renvoyer une invite d'exception de paramètre. Il ressort du code source de createXX() qu'ils appellent tous la méthode createFromFormat().

<?php
echo Carbon::createFromFormat(&#39;Y-m-d H&#39;, &#39;1975-05-21 22&#39;)->toDateTimeString(); // 1975-05-21 22:00:00

Les deux dernières méthodes de création mentionnées traitent toutes deux des horodatages Unix. Le premier renverra une instance Carbon égale à l'horodatage attendu, le fuseau horaire peut être défini ou la valeur par défaut peut être sélectionnée. La deuxième méthode, createFromTimestampUTC() diffère de la première en ce que le fuseau horaire sera toujours UTC(GMT). Le deuxième exemple de la première méthode vise simplement à rendre l'utilisation de cette fonction plus claire. Les horodatages négatifs sont également autorisés. La méthode

<?php
echo Carbon::createFromTimestamp(-1)->toDateTimeString();                        // 1969-12-31 18:59:59
echo Carbon::createFromTimestamp(-1, &#39;Europe/London&#39;)->toDateTimeString();       // 1970-01-01 00:59:59
echo Carbon::createFromTimeStampUTC(-1)->toDateTimeString();                     // 1969-12-31 23:59:59

copy() peut copier une instance Carbon existante. Les modifications apportées à l'instance générée par la copie n'affecteront pas l'objet copié lui-même.

<?php
$dt = Carbon::now();
echo $dt->diffInYears($dt->copy()->addYear());  // 1
 
// $dt was unchanged and still holds the value of Carbon:now()

Enfin, si vous utilisez une instance DateTime obtenue en instanciant une autre bibliothèque DateTime qui l'étend, n'ayez pas peur ! Les instances Carbon peuvent toujours être créées de manière extrêmement conviviale grâce à la méthode suivante.

<?php
$dt = new \DateTime(&#39;first day of January 2008&#39;); // <== instance from another API
$carbon = Carbon::instance($dt);
echo get_class($carbon);                               // &#39;Carbon\Carbon&#39;
echo $carbon->toDateTimeString();                      // 2008-01-01 00:00:00

Quelques manipulations des millisecondes. La classe DateTime fournie avec PHP peut également définir des millisecondes, mais les millisecondes ne sont pas prises en compte lors des estimations mathématiques des dates. À partir de la version 1.12.0 de Carbon, l'instanciation et la copie peuvent également prendre en charge les millisecondes comme la méthode format() (par défaut, seul Datetime::format() en PHP prend en charge les millisecondes).

<?php
$dt = Carbon::parse(&#39;1975-05-21 22:23:00.123456&#39;);
echo $dt->micro;                                       // 123456
echo $dt->copy()->micro;                               // 123456

Obtenez la plage de valeurs de temps valide prise en charge par PHP : heure la plus ancienne, heure la plus récente

<?php
echo Carbon::maxValue();                               // &#39;2038-01-18 22:14:07&#39;
echo Carbon::minValue();                               // &#39;1901-12-13 15:45:52&#39;

3.Localisation

Dans Carbon, la méthode formatLocalized() compense le fait que la classe DateTime sous-jacente en PHP ne la prend pas en charge en appelant la méthode strftime(). Pièges dans les paramètres de régionalisation. Si vous avez défini les paramètres régionaux actuels à l'aide de la méthode setlocale(), la méthode formatLocalized($format) renverra le format de paramètres régionaux défini. Les résultats

<?php
setlocale(LC_TIME, &#39;German&#39;);
echo $dt->formatLocalized(&#39;%A %d %B %Y&#39;);          // Mittwoch 21 Mai 1975
setlocale(LC_TIME, &#39;&#39;);
echo $dt->formatLocalized(&#39;%A %d %B %Y&#39;);          // Wednesday 21 May 1975

diffForHumans() seront également convertis dans la langue régionale. La langue régionale de Carbon peut être définie via la méthode Carbon::setLocale().

<?php
Carbon::setLocale(&#39;de&#39;);
echo Carbon::now()->addYear()->diffForHumans();    // in 1 Jahr
 
Carbon::setLocale(&#39;en&#39;);

注意:如果在linux系统中转换出现了问题,请仔细检查安装在本地或生产系统中语言环境

locale -a 列举出所有可用的语言环境

sudo locale-gen zh_CN.utf8 安装新的语言环境

sudo dpkg-reconfigure locales 配置启用新的语言环境,并重启

4.Testing Aids()

通过测试方法可以得到一个模拟或真实的 Carbon 实例。只有在以下情况下,主动提供的 Carbon 实例才会被特殊处理:

  • 调用静态方法 now(),例如:Carbon::now()
  • 传给 construct 或 parse() 方法的是 null (或空字符串),例如:new Carbon(null)
  • 当传给 construct 或 parse()的是字符串 now,例如:new Carbon(‘now’)
$knownDate = Carbon::create(2001, 5, 21, 12);          // create testing date
Carbon::setTestNow($knownDate);                        // set the mock (of course this could be a real mock object)
echo Carbon::now();                                    // 2001-05-21 12:00:00
echo new Carbon();                                     // 2001-05-21 12:00:00
echo Carbon::parse();                                  // 2001-05-21 12:00:00
echo new Carbon(&#39;now&#39;);                                // 2001-05-21 12:00:00
echo Carbon::parse(&#39;now&#39;);                             // 2001-05-21 12:00:00
var_dump(Carbon::hasTestNow());                        // bool(true)
Carbon::setTestNow();                                  // clear the mock
var_dump(Carbon::hasTestNow());                        // bool(false)
echo Carbon::now();

有用的例子:

class SeasonalProduct
{
    protected $price;
 
    public function __construct($price)
{
        $this->price = $price;
    }
 
    public function getPrice() {
        $multiplier = 1;
        if (Carbon::now()->month == 12) {
            $multiplier = 2;
        }
 
        return $this->price * $multiplier;
    }
}
 
$product = new SeasonalProduct(100);
Carbon::setTestNow(Carbon::parse(&#39;first day of March 2000&#39;));
echo $product->getPrice();                                             // 100
Carbon::setTestNow(Carbon::parse(&#39;first day of December 2000&#39;));
echo $product->getPrice();                                             // 200
Carbon::setTestNow(Carbon::parse(&#39;first day of May 2000&#39;));
echo $product->getPrice();                                             // 100
Carbon::setTestNow();

一些相关的用法也可以得到一个模拟的 now 实例,返回相应的模拟数据。

$knownDate = Carbon::create(2001, 5, 21, 12);          // create testing date
Carbon::setTestNow($knownDate);                        // set the mock
echo new Carbon(&#39;tomorrow&#39;);                           // 2001-05-22 00:00:00  ... notice the time !
echo new Carbon(&#39;yesterday&#39;);                          // 2001-05-20 00:00:00
echo new Carbon(&#39;next wednesday&#39;);                     // 2001-05-23 00:00:00
echo new Carbon(&#39;last friday&#39;);                        // 2001-05-18 00:00:00
echo new Carbon(&#39;this thursday&#39;);                      // 2001-05-24 00:00:00
Carbon::setTestNow();

以下是当前支持的时间转换字

  • this
  • last
  • next
  • tomorrow
  • yesterday
  • +
  • -
  • first
  • ago

值得注意的是像 next() , previous() 和 modify() 方法等相关的修改会把日期的时间部分设置成 00:00:00 。

5.Getters

获取器通过PHP的 __get() 方式实现。可以直接通过一下方式直接获取到属性的值。

$dt = Carbon::parse(&#39;2012-9-5 23:26:11.123789&#39;);
 
// These getters specifically return integers, ie intval()
var_dump($dt->year);                                         // int(2012)
var_dump($dt->month);                                        // int(9)
var_dump($dt->day);                                          // int(5)
var_dump($dt->hour);                                         // int(23)
var_dump($dt->minute);                                       // int(26)
var_dump($dt->second);                                       // int(11)
var_dump($dt->micro);                                        // int(123789)
var_dump($dt->dayOfWeek);                                    // int(3)
var_dump($dt->dayOfYear);                                    // int(248)
var_dump($dt->weekOfMonth);                                  // int(1)
var_dump($dt->weekOfYear);                                   // int(36)
var_dump($dt->daysInMonth);                                  // int(30)
var_dump($dt->timestamp);                                    // int(1346901971)
var_dump(Carbon::createFromDate(1975, 5, 21)->age);          // int(41) calculated vs now in the same tz
var_dump($dt->quarter);                                      // int(3)
 
// Returns an int of seconds difference from UTC (+/- sign included)
var_dump(Carbon::createFromTimestampUTC(0)->offset);         // int(0)
var_dump(Carbon::createFromTimestamp(0)->offset);            // int(-18000)
 
// Returns an int of hours difference from UTC (+/- sign included)
var_dump(Carbon::createFromTimestamp(0)->offsetHours);       // int(-5)
 
// Indicates if day light savings time is on
var_dump(Carbon::createFromDate(2012, 1, 1)->dst);           // bool(false)
var_dump(Carbon::createFromDate(2012, 9, 1)->dst);           // bool(true)
 
// Indicates if the instance is in the same timezone as the local timezone
var_dump(Carbon::now()->local);                              // bool(true)
var_dump(Carbon::now(&#39;America/Vancouver&#39;)->local);           // bool(false)
 
// Indicates if the instance is in the UTC timezone
var_dump(Carbon::now()->utc);                                // bool(false)
var_dump(Carbon::now(&#39;Europe/London&#39;)->utc);                 // bool(false)
var_dump(Carbon::createFromTimestampUTC(0)->utc);            // bool(true)
 
// Gets the DateTimeZone instance
echo get_class(Carbon::now()->timezone);                     // DateTimeZone
echo get_class(Carbon::now()->tz);                           // DateTimeZone
 
// Gets the DateTimeZone instance name, shortcut for ->timezone->getName()
echo Carbon::now()->timezoneName;                            // America/Toronto
echo Carbon::now()->tzName;                                  // America/Toronto

6.Setters

Setters 通过PHP的 __set() 方法实现。值得注意的是,通过这种方式设置时间戳时,时区不会相对于时间戳而改变。如果需要改变时区的话,需要针对时区单独设置。

$dt = Carbon::now();
 
$dt->year = 1975;
$dt->month = 13;             // would force year++ and month = 1
$dt->month = 5;
$dt->day = 21;
$dt->hour = 22;
$dt->minute = 32;
$dt->second = 5;
 
$dt->timestamp = 169957925;  // This will not change the timezone
 
// Set the timezone via DateTimeZone instance or string
$dt->timezone = new DateTimeZone(&#39;Europe/London&#39;);
$dt->timezone = &#39;Europe/London&#39;;
$dt->tz = &#39;Europe/London&#39;;

7.Fluent Setters

此处 Setters 方法的参数是必选参数,Carbon 提供了更多种设置方式可供使用。值得注意的是,所有对于时区的修改都会影响整个到 Carbon 实例。对时间戳进行修改时不会自动转换到时间戳对应的时区。

$dt = Carbon::now();
 
$dt->year(1975)->month(5)->day(21)->hour(22)->minute(32)->second(5)->toDateTimeString();
$dt->setDate(1975, 5, 21)->setTime(22, 32, 5)->toDateTimeString();
$dt->setDateTime(1975, 5, 21, 22, 32, 5)->toDateTimeString();
 
$dt->timestamp(169957925)->timezone(&#39;Europe/London&#39;);
 
$dt->tz(&#39;America/Toronto&#39;)->setTimezone(&#39;America/Vancouver&#39;);

8.IsSet

当尝试调用 Carbon 实例的属性时,会首先检查该属性是否存在,存在返回 true,不存在返回 false。

var_dump(isset(Carbon::now()->iDoNotExist));       // bool(false)
var_dump(isset(Carbon::now()->hour));              // bool(true)
var_dump(empty(Carbon::now()->iDoNotExist));       // bool(true)
var_dump(empty(Carbon::now()->year));              // bool(false)

(推荐教程:PHP视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer