Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in die Verwendung der Zeitverarbeitungsklasse Carbon in PHP

Detaillierte Einführung in die Verwendung der Zeitverarbeitungsklasse Carbon in PHP

WBOY
WBOYnach vorne
2022-07-28 15:46:075248Durchsuche

Dieser Artikel stellt Ihnen hauptsächlich das relevante Wissen über PHP vor, eine einfache PHP-API-Erweiterung für DateTime. Im Folgenden wird die Verwendung dieser Klasse erläutert hilft allen.

Detaillierte Einführung in die Verwendung der Zeitverarbeitungsklasse Carbon in PHP

(Empfohlenes Tutorial: PHP-Video-Tutorial)

1. Einführung

Carbon ist eine Datumsverarbeitungsbibliothek für PHP (eine einfache PHP-API-Erweiterung für DateTime).

Carbon erbt die Datetime-Klasse von PHP, sodass alle Methoden verwendet werden können, die nicht in Carbon enthalten sind, aber in Datetime implementiert wurden.

Schauen Sie sich den Code an

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

Die Carbon-Klasse wird unter dem Carbon-Namespace deklariert. Sie können den Namespace eingeben, anstatt jedes Mal den vollständigen Klassennamen einzugeben.

<?php
use Carbon\Carbon;

Hinweis: Wenn Sie bei der Verwendung von Carbon die Zeitzone nicht speziell festlegen, wird standardmäßig die Zeitzone Amerika/Toronto verwendet.

Achten Sie besonders darauf, ob die richtige Zeitzone verwendet wird. Beispielsweise verwenden alle Differenzvergleiche in Carbon UTC oder die vom System eingestellte Zeitzone.

<?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

Die oben durchgeführten Zeitvergleiche wurden in der Zeitzone der bereitgestellten Carbon-Instanz durchgeführt. Die Zeitzone des Autors ist beispielsweise Tokioter Zeit minus 13 Stunden, also nach 13 Uhr. Carbon::now(‘Asia/Tokyo’)->isToday() gibt false zurück. Wenn die Zeitzone beim Aufruf von now() auf die Zeitzone Tokio eingestellt ist, ist es nicht sinnvoll, die Zeitzone Tokio für nachfolgende Vorgänge zu verwenden. Beim Vergleich mit einer von now() erstellten Instanz erfolgt die Standardeinstellung also in der aktuellen Zeitzone.

2.Instantiierung

Es gibt mehrere Möglichkeiten, eine Instanz von Carbon zu erstellen, aber jeder sollte es vorziehen, sie über diese semantische statische Methode zu implementieren.

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

Es ist erwähnenswert, dass der zweite Parameter des Carbon-Konstruktors so erweitert wurde, dass er nicht nur eine DateTimeZone-Instanz ist, sondern auch ein String oder eine Ganzzahl (die einen Offsetwert relativ zur GMT darstellt). Nehmen wir ein Beispiel, um die Methode now() zu veranschaulichen.

<?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

Sie werden gerne die Methode parse() verwenden, um die ursprüngliche umständliche Konstruktionsmethode zu ersetzen.

<?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

Zu Methoden wie now(), die Carbon-Instanzen direkt zurückgeben, gehören today(), Tomorrow() und Yesterday(). Sie alle akzeptieren eine Zeitzone Typparameter und der Zeitteil des Endergebnisses ist 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

Im Folgenden sind einige andere statische Methoden in Form von creatXXX() aufgeführt. Die Parameter der meisten statischen Methoden können übergeben werden oder nicht. Wenn sie nicht übergeben werden, werden die von der Methode voreingestellten Werte verwendet. Diese voreingestellten Werte basieren im Allgemeinen auf dem aktuellen Datum, der aktuellen Uhrzeit und der Zeitzone. Wenn ein erforderlicher Parameter nicht übergeben wird, wird eine Ausnahme vom Typ InvalidArgumentException ausgelöst. Verwenden Sie die Methode DateTime::getLastErrors(), um die Details der Ausnahme abzurufen.

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

createFromDate() gibt standardmäßig die aktuelle Zeit zurück und das Datum von createFromTime() ist standardmäßig der heutige Tag. Alle Nullparameter von crete() werden standardmäßig auf die aktuelle entsprechende Zeit eingestellt. Ebenso wird als Zeitzone standardmäßig die aktuelle Zeitzone verwendet. Wenn nur die Stunden eingestellt sind, aber nicht die Minuten und Sekunden, werden die Minuten und Sekunden standardmäßig auf 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() und PHPs DateTime::createFromFormat gesetzt. Der Unterschied besteht darin, dass der Parameter $dt eine Instanz von DateTImeZone oder eine Zeitzonenzeichenfolge sein kann. Und es kann eine Parameterausnahmeaufforderung zurückgeben. Aus dem Quellcode von createXX () ist ersichtlich, dass alle die Methode createFromFormat () aufrufen.

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

Die letzten beiden genannten Erstellungsmethoden befassen sich beide mit Unix-Zeitstempeln. Der erste gibt eine Carbon-Instanz zurück, die dem erwarteten Zeitstempel entspricht. Die Zeitzone kann festgelegt oder der Standardwert ausgewählt werden. Die zweite Methode, createFromTimestampUTC(), unterscheidet sich von der ersten dadurch, dass die Zeitzone immer UTC(GMT) ist. Das zweite Beispiel der ersten Methode dient lediglich der Verdeutlichung der Verwendung dieser Funktion. Negative Zeitstempel sind ebenfalls zulässig. Die Methode

<?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() kann eine vorhandene Carbon-Instanz kopieren. Änderungen an der durch Kopie generierten Instanz wirken sich nicht auf das kopierte Objekt selbst aus.

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

Wenn Sie schließlich eine DateTime-Instanz verwenden, die durch Instanziieren einer anderen DateTime-Bibliothek, die sie erweitert, erhalten wurde, haben Sie keine Angst! Carbon-Instanzen können mit der folgenden Methode dennoch äußerst benutzerfreundlich erstellt werden.

<?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

Einige Handhabung von Millisekunden. Die mit PHP gelieferte DateTime-Klasse kann ebenfalls Millisekunden festlegen, Millisekunden werden jedoch bei mathematischen Schätzungen von Datumsangaben nicht berücksichtigt. Ab Carbon-Version 1.12.0 können Instanziierung und Kopieren auch Millisekunden wie die format()-Methode unterstützen (standardmäßig unterstützt nur Datetime::format() in PHP Millisekunden).

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

Rufen Sie den von PHP unterstützten gültigen Zeitwertebereich ab: früheste Zeit, späteste Zeit

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

3.Localization

In Carbon gleicht die formatLocalized()-Methode die Tatsache aus, dass die zugrunde liegende DateTime-Klasse in PHP dies nicht unterstützt durch den Aufruf der strftime()-Methode. Fallstricke in den Regionalisierungseinstellungen. Wenn Sie das aktuelle Gebietsschema mithilfe der Methode setlocale() festgelegt haben, gibt die Methode formatLocalized($format) das festgelegte Gebietsschemaformat zurück.

<?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()-Ergebnisse werden auch in die Regionalsprache konvertiert. Die regionale Sprache von Carbon kann über die Methode Carbon::setLocale() festgelegt werden.

<?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视频教程

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Verwendung der Zeitverarbeitungsklasse Carbon in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen