詳解PHP中時間處理類Carbon常用方法的使用
1.String Formatting
所有類似 toXXXString() 這樣的方法都依賴于DateTime::format()。__toString() 方法允許 Carbon 實例被打印時以一種可讀性更好的方式被打印出來。
$dt = Carbon::create(1975, 12, 25, 14, 15, 16); var_dump($dt->toDateTimeString() == $dt); // bool(true) => uses __toString() echo $dt->toDateString(); // 1975-12-25 echo $dt->toFormattedDateString(); // Dec 25, 1975 echo $dt->toTimeString(); // 14:15:16 echo $dt->toDateTimeString(); // 1975-12-25 14:15:16 echo $dt->toDayDateTimeString(); // Thu, Dec 25, 1975 2:15 PM // ... of course format() is still available echo $dt->format('l jS \\of F Y h:i:s A'); // Thursday 25th of December 1975 02:15:16 PM
另外可以默認設(shè)置 __toString() 方法所要顯示的時間日期格式。
Carbon::setToStringFormat('jS \o\f F, Y g:i:s a'); echo $dt; // 25th of December, 1975 2:15:16 pm Carbon::resetToStringFormat(); echo $dt; // 1975-12-25 14:15:16
如果需要設(shè)定特定的語言顯示,請參考 Localization 部分。
2.Common Formats
下面是對 DateTime 類提供的通用格式的一些封裝。
$dt = Carbon::now(); // $dt->toAtomString() is the same as $dt->format(DateTime::ATOM); echo $dt->toAtomString(); // 1975-12-25T14:15:16-05:00 echo $dt->toCookieString(); // Thursday, 25-Dec-1975 14:15:16 EST echo $dt->toIso8601String(); // 1975-12-25T14:15:16-0500 echo $dt->toRfc822String(); // Thu, 25 Dec 75 14:15:16 -0500 echo $dt->toRfc850String(); // Thursday, 25-Dec-75 14:15:16 EST echo $dt->toRfc1036String(); // Thu, 25 Dec 75 14:15:16 -0500 echo $dt->toRfc1123String(); // Thu, 25 Dec 1975 14:15:16 -0500 echo $dt->toRfc2822String(); // Thu, 25 Dec 1975 14:15:16 -0500 echo $dt->toRfc3339String(); // 1975-12-25T14:15:16-05:00 echo $dt->toRssString(); // Thu, 25 Dec 1975 14:15:16 -0500 echo $dt->toW3cString(); // 1975-12-25T14:15:16-05:00
3.Comparison
通過以下方式可以對兩個 Carbon 實例進行簡單的比較。牢記這些比較都是在UTC時區(qū)下完成的。
echo Carbon::now()->tzName; // America/Toronto $first = Carbon::create(2012, 9, 5, 23, 26, 11); $second = Carbon::create(2012, 9, 5, 20, 26, 11, 'America/Vancouver'); echo $first->toDateTimeString(); // 2012-09-05 23:26:11 echo $first->tzName; // America/Toronto echo $second->toDateTimeString(); // 2012-09-05 20:26:11 echo $second->tzName; // America/Vancouver var_dump($first->eq($second)); // bool(true) var_dump($first->ne($second)); // bool(false) var_dump($first->gt($second)); // bool(false) var_dump($first->gte($second)); // bool(true) var_dump($first->lt($second)); // bool(false) var_dump($first->lte($second)); // bool(true) $first->setDateTime(2012, 1, 1, 0, 0, 0); $second->setDateTime(2012, 1, 1, 0, 0, 0); // Remember tz is 'America/Vancouver' var_dump($first->eq($second)); // bool(false) var_dump($first->ne($second)); // bool(true) var_dump($first->gt($second)); // bool(false) var_dump($first->gte($second)); // bool(false) var_dump($first->lt($second)); // bool(true) var_dump($first->lte($second)); // bool(true)
如果要判斷當前實例對應(yīng)的時間,是否在其他兩個實例對應(yīng)的時間之間,可以用 between() 方法。如果提供了第三個參數(shù),并且為 true,將會進行 >= 和 <= 的操作。如果為 false,會進行 > 和 < 的操作。該參數(shù)默認是 true 。
$first = Carbon::create(2012, 9, 5, 1); $second = Carbon::create(2012, 9, 5, 5); var_dump(Carbon::create(2012, 9, 5, 3)->between($first, $second)); // bool(true) var_dump(Carbon::create(2012, 9, 5, 5)->between($first, $second)); // bool(true) var_dump(Carbon::create(2012, 9, 5, 5)->between($first, $second, false)); // bool(false)
還記得 min() 和 max() 嗎?min() 將會返回兩個實例中時間較早的實例,max() 返回時間較晚的那個。如果沒有提供給 min() 或 max() 任何參數(shù),將會拿當前時間和調(diào)用該方法的實例進行比較。
$dt1 = Carbon::create(2012, 1, 1, 0, 0, 0); $dt2 = Carbon::create(2014, 1, 30, 0, 0, 0); echo $dt1->min($dt2); // 2012-01-01 00:00:00 $dt1 = Carbon::create(2012, 1, 1, 0, 0, 0); $dt2 = Carbon::create(2014, 1, 30, 0, 0, 0); echo $dt1->max($dt2); // 2014-01-30 00:00:00 // now is the default param $dt1 = Carbon::create(2000, 1, 1, 0, 0, 0); echo $dt1->max(); // 2016-06-24 15:18:34
Carbon 提供了一些見名知意的輔助方法去處理大部分用到的場景。需要執(zhí)行比較操作的方法都會與當前時區(qū)的當前時間進行比較。
$dt = Carbon::now(); $dt->isWeekday(); $dt->isWeekend(); $dt->isYesterday(); $dt->isToday(); $dt->isTomorrow(); $dt->isFuture(); $dt->isPast(); $dt->isLeapYear(); $dt->isSameDay(Carbon::now()); $born = Carbon::createFromDate(1987, 4, 23); $noCake = Carbon::createFromDate(2014, 9, 26); $yesCake = Carbon::createFromDate(2014, 4, 23); $overTheHill = Carbon::now()->subYears(50); var_dump($born->isBirthday($noCake)); // bool(false) var_dump($born->isBirthday($yesCake)); // bool(true) var_dump($overTheHill->isBirthday()); // bool(true) -> default compare it to today!
4.Addition and Subtraction
默認的DateTime類提供了一對方便增加和減少時間的方法。有 modify(),add() 和 sub() 。modify() 方法接受一個標準的 data/time 字符串,該方法會對字符串進行解析,當牽扯到 add() 和 sub() 時會隱式調(diào)用DateInterval類進行處理。用鏈式調(diào)用的方式進行操作,代碼將會更加的清晰和易讀。當然,由于繼承關(guān)系這并不會影響你使用底層的方法進行操作。
$dt = Carbon::create(2012, 1, 31, 0); echo $dt->toDateTimeString(); // 2012-01-31 00:00:00 echo $dt->addYears(5); // 2017-01-31 00:00:00 echo $dt->addYear(); // 2018-01-31 00:00:00 echo $dt->subYear(); // 2017-01-31 00:00:00 echo $dt->subYears(5); // 2012-01-31 00:00:00 echo $dt->addMonths(60); // 2017-01-31 00:00:00 echo $dt->addMonth(); // 2017-03-03 00:00:00 equivalent of $dt->month($dt->month + 1); so it wraps echo $dt->subMonth(); // 2017-02-03 00:00:00 echo $dt->subMonths(60); // 2012-02-03 00:00:00 echo $dt->addDays(29); // 2012-03-03 00:00:00 echo $dt->addDay(); // 2012-03-04 00:00:00 echo $dt->subDay(); // 2012-03-03 00:00:00 echo $dt->subDays(29); // 2012-02-03 00:00:00 echo $dt->addWeekdays(4); // 2012-02-09 00:00:00 echo $dt->addWeekday(); // 2012-02-10 00:00:00 echo $dt->subWeekday(); // 2012-02-09 00:00:00 echo $dt->subWeekdays(4); // 2012-02-03 00:00:00 echo $dt->addWeeks(3); // 2012-02-24 00:00:00 echo $dt->addWeek(); // 2012-03-02 00:00:00 echo $dt->subWeek(); // 2012-02-24 00:00:00 echo $dt->subWeeks(3); // 2012-02-03 00:00:00 echo $dt->addHours(24); // 2012-02-04 00:00:00 echo $dt->addHour(); // 2012-02-04 01:00:00 echo $dt->subHour(); // 2012-02-04 00:00:00 echo $dt->subHours(24); // 2012-02-03 00:00:00 echo $dt->addMinutes(61); // 2012-02-03 01:01:00 echo $dt->addMinute(); // 2012-02-03 01:02:00 echo $dt->subMinute(); // 2012-02-03 01:01:00 echo $dt->subMinutes(61); // 2012-02-03 00:00:00 echo $dt->addSeconds(61); // 2012-02-03 00:01:01 echo $dt->addSecond(); // 2012-02-03 00:01:02 echo $dt->subSecond(); // 2012-02-03 00:01:01 echo $dt->subSeconds(61); // 2012-02-03 00:00:00
當然你也可以傳遞負值到addXXX()方法,實際這正是subXXX()方法所實現(xiàn)的功能。
5.Difference
以下方法總是返回兩個實例之間的時間差。與基類中的 diff() 方法不同的是,diff() 方法會通過DateInterval實例將61秒轉(zhuǎn)化成1分1秒來返回。下邊的這些方法第一個參數(shù)是將會用來比較的 Carbon 實例,默認為 now() 方法創(chuàng)建的當前時間實例。第二個參數(shù)也是可選的,指明了你是否需要返回一個比較結(jié)果的絕對值,默認為 true,當?shù)诙€參數(shù)為 false,并且用于比較的實例時間早于被比較的實例時,返回負數(shù)。所有的比較操作都在UTC時區(qū)下完成。
// Carbon::diffInYears(Carbon $dt = null, $abs = true) echo Carbon::now('America/Vancouver')->diffInSeconds(Carbon::now('Europe/London')); // 0 $dtOttawa = Carbon::createFromDate(2000, 1, 1, 'America/Toronto'); $dtVancouver = Carbon::createFromDate(2000, 1, 1, 'America/Vancouver'); echo $dtOttawa->diffInHours($dtVancouver); // 3 echo $dtOttawa->diffInHours($dtVancouver, false); // 3 echo $dtVancouver->diffInHours($dtOttawa, false); // -3 $dt = Carbon::create(2012, 1, 31, 0); echo $dt->diffInDays($dt->copy()->addMonth()); // 31 echo $dt->diffInDays($dt->copy()->subMonth(), false); // -31 $dt = Carbon::create(2012, 4, 30, 0); echo $dt->diffInDays($dt->copy()->addMonth()); // 30 echo $dt->diffInDays($dt->copy()->addWeek()); // 7 $dt = Carbon::create(2012, 1, 1, 0); echo $dt->diffInMinutes($dt->copy()->addSeconds(59)); // 0 echo $dt->diffInMinutes($dt->copy()->addSeconds(60)); // 1 echo $dt->diffInMinutes($dt->copy()->addSeconds(119)); // 1 echo $dt->diffInMinutes($dt->copy()->addSeconds(120)); // 2 echo $dt->addSeconds(120)->secondsSinceMidnight(); // 120
一些特殊的過濾方法,像 diffInDaysFiltered() 、diffInHoursFiltered() 和 diffFiltered() ,可以幫助你過濾時間差中的 days 、hour 或者一個自定義的時間間隔。下邊是統(tǒng)計兩個實例之間的周末天數(shù)。
$dt = Carbon::create(2014, 1, 1); $dt2 = Carbon::create(2014, 12, 31); $daysForExtraCoding = $dt->diffInDaysFiltered(function(Carbon $date) { return $date->isWeekend(); }, $dt2); echo $daysForExtraCoding; // 104 $dt = Carbon::create(2014, 1, 1)->startOfDay(); $dt2 = $dt->copy()->endOfDay(); $littleHandRotations = $dt->diffFiltered(CarbonInterval::minute(), function(Carbon $date) { return $date->minute === 0; }, $dt2); echo $littleHandRotations; // 24 // others that are defined // diffInYears(), diffInMonths(), diffInWeeks() // diffInDays(), diffInWeekdays(), diffInWeekendDays() // diffInHours(), diffInMinutes(), diffInSeconds() // secondsSinceMidnight(), secondsUntilEndOfDay()
6.Difference for Humans
對于人們來說,一月前比30天前更加易與理解。這是一個常見的方法在許多日期處理類庫中,所以他想也應(yīng)該把這個加進來。這里把一個月看做四周,這些方法需要一個可選的 Carbon 實例作為參數(shù)來進行比較,默認為當前時間的實例。
這些方法會在兩個時間差值后增加一寫描述,可能類似下邊這四種:
When comparing a value in the past to default now:
- 1 hour ago
- 5 months ago
When comparing a value in the future to default now:
- 1 hour from now
- 5 months from now
When comparing a value in the past to another value:
- 1 hour before
- 5 months before
When comparing a value in the future to another value:
- 1 hour after
- 5 months after
你也可以傳遞第二個參數(shù)去掉類似 ago,from now 這種修飾符,類似這樣的用法 diffForHumans(Carbon $other, true) 等。
// The most typical usage is for comments // The instance is the date the comment was created and its being compared to default now() echo Carbon::now()->subDays(5)->diffForHumans(); // 5 days ago echo Carbon::now()->diffForHumans(Carbon::now()->subYear()); // 1 year after $dt = Carbon::createFromDate(2011, 8, 1); echo $dt->diffForHumans($dt->copy()->addMonth()); // 1 month before echo $dt->diffForHumans($dt->copy()->subMonth()); // 1 month after echo Carbon::now()->addSeconds(5)->diffForHumans(); // 5 seconds from now echo Carbon::now()->subDays(24)->diffForHumans(); // 3 weeks ago echo Carbon::now()->subDays(24)->diffForHumans(null, true); // 3 weeks
你也通過在 diffForHumans() 被調(diào)用前,使用 Carbon::setLocale(‘fr’) 來改變語言設(shè)置。詳細請參考 localization 部分。
7.Modifiers
Carbon argument.這些方法組對修改當前實例很有幫助。你會注意到 startOfXXX(),next(),和 previous() 方法將會設(shè)置時間為 00:00:00,另外 endOfXXX() 方法將會設(shè)置時間為 23:59:59 。
$dt = Carbon::create(2012, 1, 31, 12, 0, 0); echo $dt->startOfDay(); // 2012-01-31 00:00:00 $dt = Carbon::create(2012, 1, 31, 12, 0, 0); echo $dt->endOfDay(); // 2012-01-31 23:59:59 $dt = Carbon::create(2012, 1, 31, 12, 0, 0); echo $dt->startOfMonth(); // 2012-01-01 00:00:00 $dt = Carbon::create(2012, 1, 31, 12, 0, 0); echo $dt->endOfMonth(); // 2012-01-31 23:59:59 $dt = Carbon::create(2012, 1, 31, 12, 0, 0); echo $dt->startOfYear(); // 2012-01-01 00:00:00 $dt = Carbon::create(2012, 1, 31, 12, 0, 0); echo $dt->endOfYear(); // 2012-12-31 23:59:59 $dt = Carbon::create(2012, 1, 31, 12, 0, 0); echo $dt->startOfDecade(); // 2010-01-01 00:00:00 $dt = Carbon::create(2012, 1, 31, 12, 0, 0); echo $dt->endOfDecade(); // 2019-12-31 23:59:59 $dt = Carbon::create(2012, 1, 31, 12, 0, 0); echo $dt->startOfCentury(); // 2000-01-01 00:00:00 $dt = Carbon::create(2012, 1, 31, 12, 0, 0); echo $dt->endOfCentury(); // 2099-12-31 23:59:59 $dt = Carbon::create(2012, 1, 31, 12, 0, 0); echo $dt->startOfWeek(); // 2012-01-30 00:00:00 var_dump($dt->dayOfWeek == Carbon::MONDAY); // bool(true) : ISO8601 week starts on Monday $dt = Carbon::create(2012, 1, 31, 12, 0, 0); echo $dt->endOfWeek(); // 2012-02-05 23:59:59 var_dump($dt->dayOfWeek == Carbon::SUNDAY); // bool(true) : ISO8601 week ends on Sunday $dt = Carbon::create(2012, 1, 31, 12, 0, 0); echo $dt->next(Carbon::WEDNESDAY); // 2012-02-01 00:00:00 var_dump($dt->dayOfWeek == Carbon::WEDNESDAY); // bool(true) $dt = Carbon::create(2012, 1, 1, 12, 0, 0); echo $dt->next(); // 2012-01-08 00:00:00 $dt = Carbon::create(2012, 1, 31, 12, 0, 0); echo $dt->previous(Carbon::WEDNESDAY); // 2012-01-25 00:00:00 var_dump($dt->dayOfWeek == Carbon::WEDNESDAY); // bool(true) $dt = Carbon::create(2012, 1, 1, 12, 0, 0); echo $dt->previous(); // 2011-12-25 00:00:00 $start = Carbon::create(2014, 1, 1, 0, 0, 0); $end = Carbon::create(2014, 1, 30, 0, 0, 0); echo $start->average($end); // 2014-01-15 12:00:00 // others that are defined that are similar // firstOfMonth(), lastOfMonth(), nthOfMonth() // firstOfQuarter(), lastOfQuarter(), nthOfQuarter() // firstOfYear(), lastOfYear(), nthOfYear()
8.Constants
Carbon 中定義了以下常量。
// These getters specifically return integers, ie intval() var_dump(Carbon::SUNDAY); // int(0) var_dump(Carbon::MONDAY); // int(1) var_dump(Carbon::TUESDAY); // int(2) var_dump(Carbon::WEDNESDAY); // int(3) var_dump(Carbon::THURSDAY); // int(4) var_dump(Carbon::FRIDAY); // int(5) var_dump(Carbon::SATURDAY); // int(6) var_dump(Carbon::YEARS_PER_CENTURY); // int(100) var_dump(Carbon::YEARS_PER_DECADE); // int(10) var_dump(Carbon::MONTHS_PER_YEAR); // int(12) var_dump(Carbon::WEEKS_PER_YEAR); // int(52) var_dump(Carbon::DAYS_PER_WEEK); // int(7) var_dump(Carbon::HOURS_PER_DAY); // int(24) var_dump(Carbon::MINUTES_PER_HOUR); // int(60) var_dump(Carbon::SECONDS_PER_MINUTE); // int(60)
還有
$dt = Carbon::createFromDate(2012, 10, 6); if ($dt->dayOfWeek === Carbon::SATURDAY) { echo 'Place bets on Ottawa Senators Winning!'; }
9.CarbonInterval
Carbon 類繼承了PHP 的DateInterval類。
<?php class CarbonInterval extends \DateInterval { // code here }
你也可以通過一下方法創(chuàng)建一個實例。
echo CarbonInterval::year(); // 1 year echo CarbonInterval::months(3); // 3 months echo CarbonInterval::days(3)->seconds(32); // 3 days 32 seconds echo CarbonInterval::weeks(3); // 3 weeks echo CarbonInterval::days(23); // 3 weeks 2 days echo CarbonInterval::create(2, 0, 5, 1, 1, 2, 7); // 2 years 5 weeks 1 day 1 hour 2 minutes 7 seconds
如果你繼承的 \DateInterval 實例來自其他類庫,別怕,通過 instance() 這種友好的方式你手動可以創(chuàng)建一個 CarbonInterval 實例。
$di = new \DateInterval('P1Y2M'); // <== instance from another API $ci = CarbonInterval::instance($di); echo get_class($ci); // 'Carbon\CarbonInterval' echo $ci; // 1 year 2 months
其他的一些輔助方法,但要注意這些輔助方法處理周時,只有天會被保存下來。并且是在當前實例的總天數(shù)基礎(chǔ)上計算周。
echo CarbonInterval::year()->years; // 1 echo CarbonInterval::year()->dayz; // 0 echo CarbonInterval::days(24)->dayz; // 24 echo CarbonInterval::days(24)->daysExcludeWeeks; // 3 echo CarbonInterval::weeks(3)->days(14)->weeks; // 2 <-- days setter overwrites the current value echo CarbonInterval::weeks(3)->weeks; // 3 echo CarbonInterval::minutes(3)->weeksAndDays(2, 5); // 2 weeks 5 days 3 minutes
也有一個方便的 forHumans(),在調(diào)用 __toString() 方法時,自動執(zhí)行,并打印出可讀性更好的時間格式。
CarbonInterval::setLocale('fr'); echo CarbonInterval::create(2, 1)->forHumans(); // 2 ans 1 mois echo CarbonInterval::hour()->seconds(3); // 1 heure 3 secondes CarbonInterval::setLocale('en');
當然,你可以通過 CarbonInterval::setLocale(‘fr’) 來改變語言顯示。
到此這篇關(guān)于詳解PHP中時間處理類Carbon常用方法的使用的文章就介紹到這了,更多相關(guān)PHP時間處理類Carbon內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP定時任務(wù)獲取微信access_token的方法
這篇文章主要介紹了PHP定時任務(wù)獲取微信access_token的方法,涉及php基于curl動態(tài)獲取access_token及CentOS下crontab設(shè)置計劃任務(wù)的相關(guān)操作技巧,需要的朋友可以參考下2016-10-10thinkphp操作mongo數(shù)據(jù)的三種方法
這篇文章主要給大家介紹了thinkphp操作mongo數(shù)據(jù)的三種方法,使用tp中的擴展,使用tp中的db類和使用MongoDB PHP驅(qū)動程序這三種方法,并通過代碼講解的非常詳細,需要的朋友可以參考下2023-12-12PHP has encountered an Access Violation 錯誤的解決方法
一般是因為eaccelerator的問題,windows下容易出現(xiàn)這個問題。2010-01-01PHP函數(shù)preg_match_all正則表達式的基本使用詳細解析
以下是對PHP中的函數(shù)preg_match_all正則表達式的基本使用進行了詳細的分析介紹,需要的朋友可以過來參考下2013-08-08PHP Parser 掃描應(yīng)用打印輸出結(jié)構(gòu)語句實例
這篇文章主要為大家介紹了PHP Parser 掃描應(yīng)用打印輸出結(jié)構(gòu)語句實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09