ホームページ  >  記事  >  バックエンド開発  >  PHP の時間処理クラス Carbon の使用法の詳細な紹介

PHP の時間処理クラス Carbon の使用法の詳細な紹介

WBOY
WBOY転載
2022-07-28 15:46:075216ブラウズ

この記事では主に PHP に関する知識を紹介します Carbon は PHP の Datetime クラスを継承した PHP の日付処理ライブラリ (DateTime 用のシンプルな PHP API 拡張機能) です。このクラスの内容が皆さんのお役に立てば幸いです。

PHP の時間処理クラス Carbon の使用法の詳細な紹介

(推奨チュートリアル: PHP ビデオ チュートリアル)

1.はじめに

Carbon は PHP での日付処理ですクラス ライブラリ (DateTime 用の単純な PHP API 拡張機能)。

Carbon は PHP の Datetime クラスを継承しているため、Carbon には関係ない Datetime に実装されているメソッドが利用できます。

コードを見てください

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

Carbon クラスは Carbon 名前空間で宣言されています。毎回完全なクラス名を入力する代わりに、名前空間を導入できます。

<?php
use Carbon\Carbon;

注: Carbon の使用時にタイムゾーンを特に設定しない場合、デフォルトでアメリカ/トロントのタイムゾーンが使用されます。

正しいタイム ゾーンが使用されているかどうかには特に注意してください。たとえば、Carbon のすべての違いでは、UTC またはシステムによって設定されたタイム ゾーンが使用されます。

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

上記で実行された時間比較は、提供された Carbon インスタンスのタイムゾーンで行われます。たとえば、筆者のタイムゾーンは東京時間から13時間引いた時間なので、午後1時以降になります。 Carbon::now(‘Asia/Tokyo’)->isToday() は false を返します。now() を呼び出すときにタイムゾーンが東京タイムゾーンに設定されている場合、以降の操作で東京タイムゾーンを使用することは不合理です。そのため、now() によって作成されたインスタンスと比較する場合、デフォルトは現在のタイムゾーンで行われます。

2.インスタンス化

Carbon のインスタンスを作成するにはいくつかの方法がありますが、誰もがこのセマンティック静的メソッドを通じて実装することを好むはずです。

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

Carbon コンストラクターの 2 番目のパラメーターが \DateTimeZone インスタンスに限定されるだけでなく、文字列または整数 (GMT を基準としたオフセット値を示す) にもできるように拡張されたことは注目に値します。 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

parse() メソッドを使用して、元の面倒な構築メソッドを置き換えることをお勧めします。

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

Carbon インスタンスを直接返す now() に似たメソッドには、today()、tomorrow()、 Yesterday() の場合、それらはすべてタイムゾーン タイプのパラメータを受け入れ、最終結果の時刻部分は 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

になります。次に、creatXXX() 形式の他の静的メソッドをいくつか示します。ほとんどの静的メソッドのパラメータは渡すことも渡さないこともできます。渡されない場合は、メソッドによって事前に設定されたデフォルト値が使用されます。これらの事前設定値は通常、現在の日付、時刻、およびタイムゾーンに基づきます。必須パラメータが渡されない場合、InvalidArgumentException 型の例外がスローされます。例外の詳細を取得するには、DateTime::getLastErrors() メソッドを使用します。

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

createFromDate() はデフォルトで現在時刻を返し、createFromTime() の日付のデフォルトは今日です。 crete() のすべての null パラメーターは、デフォルトで現在対応する時刻になります。同様に、タイムゾーンのデフォルトは現在のタイムゾーンになります。時間のみが設定され、分と秒が設定されていない場合、分と秒はデフォルトで 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() および PHP の DateTime::createFromFormat に設定されます。違いは、$dt パラメーターが DateTImeZone のインスタンスまたはタイム ゾーン文字列である可能性があることです。また、パラメータ例外プロンプトが返される場合もあります。 createXX() のソース コードから、これらはすべて createFromFormat() メソッドを呼び出していることがわかります。

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

前述の最後の 2 つの作成メソッドはどちらも Unix タイムスタンプを処理します。最初のインスタンスは、予想されるタイムスタンプに等しい Carbon インスタンスを返します。タイムゾーンを設定するか、デフォルト値を選択できます。 2 番目のメソッド createFromTimestampUTC() は、タイム ゾーンが常に UTC(GMT) になるという点で最初のメソッドとは異なります。最初のメソッドの 2 番目の例は、この関数の使用法をより明確にするためのものです。負のタイムスタンプも許可されており、

<?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() メソッドは既存の Carbon インスタンスをコピーできます。コピー生成されたインスタンスを変更しても、コピーされたオブジェクト自体には影響しません。

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

最後に、\DateTime を継承する別のライブラリをインスタンス化して取得した DateTime インスタンスを使用している場合でも、心配する必要はありません。 Carbon インスタンスは、次の方法で非常に使いやすく作成できます。

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

ミリ秒ほどの処理。 PHP に付属の DateTime クラスでもミリ秒を設定できますが、日付の数学的推定を行う際にミリ秒は考慮されません。 Carbon バージョン 1.12.0 以降、インスタンス化とコピーは、format() メソッドのようなミリ秒もサポートできるようになりました (デフォルトでは、PHP の Datetime::format() のみがミリ秒をサポートします)。

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

PHP でサポートされている有効な時刻値の範囲を取得します: 最も早い時間、最も遅い時間

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

Carbon では、formatLocalized() メソッドが strftime( ) を呼び出します。このメソッドは、PHP の基礎となる DateTime クラスが地域設定をサポートしていないという欠点を補います。 setlocale() メソッドを使用して現在のロケールを設定した場合、formatLocalized($format) メソッドは設定されたロケール形式を返します。

<?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() の結果も地域の言語に変換されます。 Carbon の地域言語は、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视频教程

以上がPHP の時間処理クラス Carbon の使用法の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。