Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengenalan terperinci kepada penggunaan kelas pemprosesan masa Karbon dalam PHP

Pengenalan terperinci kepada penggunaan kelas pemprosesan masa Karbon dalam PHP

WBOY
WBOYke hadapan
2022-07-28 15:46:075247semak imbas

Artikel ini terutamanya memperkenalkan anda kepada pengetahuan yang berkaitan tentang PHP Karbon ialah perpustakaan kelas pemprosesan tarikh PHP (Satu sambungan API PHP mudah untuk DateTime.), yang mewarisi kelas Datetime PHP, seperti berikut Biar saya jelaskan. penggunaan kelas ini, semoga ianya dapat membantu semua.

Pengenalan terperinci kepada penggunaan kelas pemprosesan masa Karbon dalam PHP

(Tutorial yang disyorkan: Tutorial video PHP)

1. Pengenalan

Carbon ialah pemprosesan tarikh dalam php Pustaka kelas (Satu sambungan API PHP mudah untuk DateTime.).

Carbon mewarisi kelas Datetime PHP, jadi kaedah yang tidak terlibat dalam Carbon tetapi telah dilaksanakan dalam Datetime boleh digunakan.

Lihat kod

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

Kelas Carbon diisytiharkan di bawah ruang nama Carbon Anda boleh memperkenalkan ruang nama dan bukannya memasukkan nama kelas yang lengkap setiap kali.

<?php
use Carbon\Carbon;

Nota: Jika anda tidak menetapkan zon waktu secara khusus apabila menggunakan Karbon, zon waktu Amerika/Toronto akan digunakan secara lalai.

Beri perhatian khusus sama ada zon waktu yang betul digunakan Contohnya, semua perbezaan dalam Karbon menggunakan UTC atau zon waktu yang ditetapkan oleh sistem.

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

Perbandingan masa yang dibuat di atas dilakukan dalam zon waktu contoh Carbon yang disediakan. Sebagai contoh, zon waktu pengarang ialah waktu Tokyo tolak 13 jam, jadi selepas pukul 1 tengah hari. Carbon::now(‘Asia/Tokyo’)->isToday() akan kembali palsu Jika zon waktu ditetapkan kepada zon waktu Tokyo apabila memanggil sekarang(), adalah tidak munasabah untuk menggunakan zon waktu Tokyo untuk operasi berikutnya. Jadi apabila membandingkan dengan contoh yang dibuat oleh now() lalai dilakukan dalam zon waktu semasa.

2.Instantiation

Terdapat beberapa cara untuk mencipta tika Karbon, tetapi semua orang harus memilih untuk melaksanakannya melalui kaedah statik semantik ini.

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

Perlu diperhatikan bahawa parameter kedua pembina Karbon telah dipertingkatkan untuk bukan sahaja menjadi contoh DateTimeZone, tetapi juga String atau Integer (mewakili nilai offset berbanding GMT). Mari kita ambil contoh untuk menggambarkan kaedah 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

Anda ingin menggunakan kaedah parse() untuk menggantikan kaedah pembinaan yang menyusahkan asal

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

Terdapat kaedah seperti sekarang() yang mengembalikan tika Karbon secara langsung dan hari ini (), esok(), semalam(), kesemuanya menerima parameter jenis zon waktu dan bahagian masa keputusan akhir ialah 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

Berikut ialah beberapa ciptaanXXX() yang lain bentuk kaedah statik. Parameter kebanyakan kaedah statik boleh diluluskan atau tidak Jika ia tidak diluluskan, nilai lalai yang dipratetap oleh kaedah ini biasanya berdasarkan tarikh, masa dan zon masa semasa. Jika parameter yang diperlukan tidak diluluskan, pengecualian jenis InvalidArgumentException akan dilemparkan Gunakan kaedah DateTime::getLastErrors() untuk mendapatkan butiran pengecualian.

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

createFromDate() mengembalikan masa semasa secara lalai dan tarikh createFromTime() lalai kepada hari ini. Semua parameter null crete() akan lalai kepada masa semasa yang sepadan. Begitu juga, zon waktu lalai kepada zon waktu semasa. Jika hanya jam ditetapkan tetapi bukan minit dan saat, minit dan saat lalai kepada 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() dan DateTime PHP::createFromFormat. Perbezaannya ialah parameter $dt boleh menjadi contoh DateTImeZone atau rentetan zon masa. Dan ia mungkin mengembalikan gesaan pengecualian parameter. Ia boleh dilihat daripada kod sumber createXX() bahawa mereka semua memanggil kaedah createFromFormat().

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

Dua kaedah ciptaan terakhir menyebut kedua-duanya mengendalikan cap masa Unix. Yang pertama akan mengembalikan contoh Karbon sama dengan cap masa yang dijangkakan, zon waktu boleh ditetapkan atau nilai lalai boleh dipilih. Kaedah kedua, createFromTimestampUTC() berbeza daripada yang pertama kerana zon waktu akan sentiasa UTC(GMT). Contoh kedua kaedah pertama hanyalah untuk menjadikan penggunaan fungsi ini lebih jelas. Cap masa negatif juga dibenarkan Kaedah

<?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() boleh menyalin tika Carbon yang sedia ada. Pengubahsuaian pada contoh yang dijana salinan tidak akan menjejaskan objek yang disalin itu sendiri.

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

Akhir sekali, jika tika DateTime yang anda gunakan diperolehi dengan membuat instantiat perpustakaan DateTime lain yang mewarisinya, jangan takut! Contoh karbon masih boleh dibuat dengan sangat mesra melalui kaedah berikut.

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

Sesetengah pemprosesan kira-kira milisaat. Kelas DateTime yang disertakan dengan PHP juga boleh menetapkan milisaat, tetapi milisaat tidak dipertimbangkan semasa membuat anggaran matematik tarikh. Bermula dari Carbon versi 1.12.0, instantiasi dan salinan juga boleh menyokong milisaat seperti kaedah format() (secara lalai, hanya Datetime::format() dalam PHP menyokong milisaat).

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

Dapatkan julat nilai masa yang sah yang disokong oleh PHP: masa terawal, masa terkini

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

3.Penyetempatan

Dalam Karbon, kaedah formatLocalized() Oleh memanggil kaedah strftime(), ia menebus kecacatan bahawa kelas DateTime yang mendasari dalam PHP tidak menyokong tetapan serantau. Jika anda telah menetapkan tempat semasa dengan menggunakan kaedah setlocale(), kaedah formatLocalized($format) akan mengembalikan format tempattempat yang ditetapkan.

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

Hasil diffForHumans() juga akan ditukar kepada bahasa serantau. Bahasa serantau Carbon boleh ditetapkan melalui kaedah 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视频教程

Atas ialah kandungan terperinci Pengenalan terperinci kepada penggunaan kelas pemprosesan masa Karbon dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:jb51.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam