摘要:是的日期處理類(lèi)庫(kù)。另外可以默認(rèn)設(shè)置方法所要顯示的時(shí)間日期格式。一些特殊的過(guò)濾方法,像和可以幫助你過(guò)濾時(shí)間差中的或者一個(gè)自定義的時(shí)間間隔。對(duì)于人們來(lái)說(shuō)一月前比天前更加易與理解。中定義了以下常量。
Introduction
Carbon 是php的日期處理類(lèi)庫(kù)(A simple PHP API extension for DateTime.)。
Carbon 繼承了PHP的 Datetime 類(lèi),所以 Carbon 中沒(méi)有涉及到的,但在 Datetime 中已經(jīng)實(shí)現(xiàn)的方法都是可以使用的。
Carbon 類(lèi)聲明在 Carbon 命名空間下,可以通過(guò)引入命名空間的方式來(lái)代替每次輸入完整的類(lèi)名。
Note:如果在使用 Carbon 時(shí),沒(méi)有專(zhuān)門(mén)設(shè)置時(shí)區(qū)的話,默認(rèn)使用 America/Toronto 的時(shí)區(qū)。要特別留意是否使用了正確的時(shí)區(qū),比如 Carbon 的所有差異比較都使用 UTC 或者系統(tǒng)設(shè)定的時(shí)區(qū)。
diffInHours($dtToronto); // 3以上進(jìn)行的時(shí)間比較是在提供的 Carbon 實(shí)例所在的時(shí)區(qū)下完成的。例如作者所在的時(shí)區(qū)為 東京時(shí)間減13 小時(shí),因此在下午一點(diǎn)后。Carbon::now(‘Asia/Tokyo’)->isToday() 將會(huì)返回 false ,如果在調(diào)用 now() 時(shí)設(shè)置時(shí)區(qū)為東京時(shí)區(qū),接下來(lái)的操作都使用東京時(shí)區(qū)是說(shuō)不過(guò)去的。所以在與 now() 創(chuàng)建的實(shí)例進(jìn)行比較時(shí),默認(rèn)是在當(dāng)前時(shí)區(qū)下完成的。
Instantiation有好幾種方式可以創(chuàng)建 Carbon 的實(shí)例,但是大家應(yīng)該更傾向于通過(guò)這種語(yǔ)義化的靜態(tài)方法來(lái)實(shí)現(xiàn)。
值得注意的是,Carbon 構(gòu)造器的第二個(gè)參數(shù)被增強(qiáng)到了不僅限于是 DateTimeZone 實(shí)例,還可以是 String、Integer (表示相對(duì)于GMT的偏移值)。舉個(gè)栗子來(lái)說(shuō)明下 now() 方法。
tzName; // Europe/London你將會(huì)喜歡上用 parse() 方法來(lái)代替原有繁瑣的構(gòu)造方式
addWeeks(2); // 2008-12-15 00:00:00 echo Carbon::parse("first day of December 2008")->addWeeks(2); // 2008-12-15 00:00:00類(lèi)似 now() 這樣直接返回 Carbon 實(shí)例的方法還有 today(), tomorrow(),yesterday(),他們都接受一個(gè) timezone 類(lèi)型的參數(shù),最后得到的結(jié)果時(shí)間部分都是 00:00:00
下面是一些其他的 creatXXX() 形式的靜態(tài)方法。絕大多數(shù)靜態(tài)方法的參數(shù)是可傳可不傳的,如果不傳的話會(huì)使用方法預(yù)設(shè)的默認(rèn)值,這些預(yù)設(shè)值一般都是針對(duì)當(dāng)前日期、時(shí)間、時(shí)區(qū)的。如果為傳遞某個(gè)必要參數(shù),會(huì)拋出一個(gè) InvalidArgumentException 類(lèi)型的異常,用 DateTime::getLastErrors() 方法可以得到異常的詳細(xì)信息。
createFromDate() 默認(rèn)返回當(dāng)前時(shí)間,createFromTime()日期默認(rèn)是今天。crete() 所有為 null 的參數(shù)都將默認(rèn)為當(dāng)前對(duì)應(yīng)的時(shí)間。同樣,時(shí)區(qū)也默認(rèn)是當(dāng)前時(shí)區(qū)。如果只設(shè)置了小時(shí)數(shù)沒(méi)有設(shè)置分秒那么分秒默認(rèn)是 0
getMessage(); }createFromFormat() 與php的DateTime::createFromFormat。不同之處是 $dt 參數(shù)可以是 DateTImeZone 的實(shí)例或者一個(gè)時(shí)區(qū)的字符串。并且可以會(huì)返回參數(shù)異常的提示。從createXX()的源碼可以看出,他們都調(diào)用了createFromFormat()方法。
toDateTimeString(); // 1975-05-21 22:00:00最后提到的這兩個(gè)create方法都是處理Unix時(shí)間戳的。第一個(gè)將會(huì)返回一個(gè)等于預(yù)期時(shí)間戳的 Carbon 實(shí)例,時(shí)區(qū)可以設(shè)置也可以選用默認(rèn)值。第二個(gè)方法,createFromTimestampUTC() 與第一個(gè)不同的是時(shí)區(qū)將始終是 UTC(GMT) .第一個(gè)方法的第二個(gè)示例,只是為了讓這個(gè)函數(shù)的用法展現(xiàn)的更加明確。Negative timestamps are also allowed.
toDateTimeString(); // 1969-12-31 18:59:59 echo Carbon::createFromTimestamp(-1, "Europe/London")->toDateTimeString(); // 1970-01-01 00:59:59 echo Carbon::createFromTimeStampUTC(-1)->toDateTimeString(); // 1969-12-31 23:59:59copy() 方法可以copy一個(gè)已經(jīng)存在的 Carbon 實(shí)例。對(duì)copy生成實(shí)例進(jìn)行修改并不會(huì)影響被copy對(duì)象的本身。
diffInYears($dt->copy()->addYear()); // 1 // $dt was unchanged and still holds the value of Carbon:now()最后,當(dāng)你正在使用的 DateTime 實(shí)例是通過(guò)實(shí)例化其他繼承了 DateTime 庫(kù)而得到的,別怕!通過(guò)下邊的方式仍然可以極其友好創(chuàng)建 Carbon 實(shí)例。
toDateTimeString(); // 2008-01-01 00:00:00關(guān)于毫秒的一些處理。php自帶的 DateTime 類(lèi)也可以設(shè)置毫秒,但是在進(jìn)行日期的數(shù)學(xué)預(yù)算時(shí)并不會(huì)考慮毫秒。從 Carbon 1.12.0版本起,實(shí)例化、copy也能像 format() 方法一樣支持毫秒(PHP默認(rèn)的只有 Datetime::format() 支持毫秒)。
micro; // 123456 echo $dt->copy()->micro; // 123456獲取PHP支持的有效時(shí)間取值范圍:最早時(shí)間、最晚時(shí)間
LocalizationCarbon中,formatLocalized() 方法通過(guò)調(diào)用 strftime() 方法,彌補(bǔ)了php底層的 DateTime 類(lèi)不支持區(qū)域化設(shè)置的缺陷。如果你已經(jīng)通過(guò)使用 setlocale() 方法設(shè)置過(guò)當(dāng)前區(qū)域,formatLocalized($format) 方法將會(huì)按照設(shè)置的區(qū)域格式進(jìn)行返回。
formatLocalized("%A %d %B %Y"); // Mittwoch 21 Mai 1975 setlocale(LC_TIME, ""); echo $dt->formatLocalized("%A %d %B %Y"); // Wednesday 21 May 1975diffForHumans() 的結(jié)果也會(huì)被轉(zhuǎn)化成區(qū)域語(yǔ)言。通過(guò)Carbon::setLocale() 方法可以設(shè)置 Carbon 的區(qū)域語(yǔ)言。
addYear()->diffForHumans(); // in 1 Jahr Carbon::setLocale("en");注意:如果在linux系統(tǒng)中轉(zhuǎn)換出現(xiàn)了問(wèn)題,請(qǐng)仔細(xì)檢查安裝在本地或生產(chǎn)系統(tǒng)中語(yǔ)言環(huán)境。locale -a 列舉出所有可用的語(yǔ)言環(huán)境 sudo locale-gen zh_CN.utf8 安裝新的語(yǔ)言環(huán)境 sudo dpkg-reconfigure locales 配置啟用新的語(yǔ)言環(huán)境,并重啟Testing Aids()通過(guò)測(cè)試方法可以得到一個(gè)模擬或真實(shí)的 Carbon 實(shí)例。只有在一下情況下,主動(dòng)提供的 Carbon 實(shí)例才會(huì)被特殊處理:
調(diào)用靜態(tài)方法 now(),例如: Varbon::now()
傳給 construct 或 parse() 方法的是 null (或空字符串),例如:new Carbon(null)
當(dāng)傳給 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("now"); // 2001-05-21 12:00:00 echo Carbon::parse("now"); // 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("first day of March 2000")); echo $product->getPrice(); // 100 Carbon::setTestNow(Carbon::parse("first day of December 2000")); echo $product->getPrice(); // 200 Carbon::setTestNow(Carbon::parse("first day of May 2000")); echo $product->getPrice(); // 100 Carbon::setTestNow();一些相關(guān)的用法也可以得到一個(gè)模擬的 now 實(shí)例,返回相應(yīng)的模擬數(shù)據(jù)。
$knownDate = Carbon::create(2001, 5, 21, 12); // create testing date Carbon::setTestNow($knownDate); // set the mock echo new Carbon("tomorrow"); // 2001-05-22 00:00:00 ... notice the time ! echo new Carbon("yesterday"); // 2001-05-20 00:00:00 echo new Carbon("next wednesday"); // 2001-05-23 00:00:00 echo new Carbon("last friday"); // 2001-05-18 00:00:00 echo new Carbon("this thursday"); // 2001-05-24 00:00:00 Carbon::setTestNow();以下是當(dāng)前支持的時(shí)間轉(zhuǎn)換字
this
net
last
this
next
last
tomorrow
yesterday
+
-
first
last
ago
值得注意的是像 next() , previous() 和 modify() 方法等相關(guān)的修改會(huì)把日期的時(shí)間部分設(shè)置成 00:00:00 。
Getters獲取器通過(guò)PHP的 __get() 方式實(shí)現(xiàn)。可以直接通過(guò)一下方式直接獲取到屬性的值。
$dt = Carbon::parse("2012-9-5 23:26:11.123789"); // 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("America/Vancouver")->local); // bool(false) // Indicates if the instance is in the UTC timezone var_dump(Carbon::now()->utc); // bool(false) var_dump(Carbon::now("Europe/London")->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/TorontoSettersSetters 通過(guò)PHP的 __set() 方法實(shí)現(xiàn)。值得注意的是,通過(guò)這種方式設(shè)置時(shí)間戳?xí)r,時(shí)區(qū)不會(huì)相對(duì)于時(shí)間戳而改變。如果需要改變時(shí)區(qū)的話,需要針對(duì)時(shí)區(qū)多帶帶設(shè)置。
$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("Europe/London"); $dt->timezone = "Europe/London"; $dt->tz = "Europe/London";Fluent Setters此處 Setters 方法的參數(shù)是必選參數(shù),Carbon 提供了更多種設(shè)置方式可供使用。值得注意的是,所有對(duì)于時(shí)區(qū)的修改都會(huì)影響整個(gè)到 Carbon 實(shí)例。對(duì)時(shí)間戳進(jìn)行修改時(shí)不會(huì)自動(dòng)轉(zhuǎn)換到時(shí)間戳對(duì)應(yīng)的時(shí)區(qū)。
$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("Europe/London"); $dt->tz("America/Toronto")->setTimezone("America/Vancouver");IsSet當(dāng)嘗試調(diào)用 Carbon 實(shí)例的屬性時(shí),會(huì)首先檢查該屬性是否存在,存在返回 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)String Formatting所有類(lèi)似 toXXXString() 這樣的方法都依賴于DateTime::format()。__toString() 方法允許 Carbon 實(shí)例被打印時(shí)以一種可讀性更好的方式被打印出來(lái)。
$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另外可以默認(rèn)設(shè)置 __toString() 方法所要顯示的時(shí)間日期格式。
Carbon::setToStringFormat("jS of 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è)定特定的語(yǔ)言顯示,請(qǐng)參考 Localization 部分。Common Formats下面是對(duì) DateTime 類(lèi)提供的通用格式的一些封裝。
$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:00Comparison通過(guò)以下方式可以對(duì)兩個(gè) Carbon 實(shí)例進(jìn)行簡(jiǎn)單的比較。牢記這些比較都是在UTC時(shí)區(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)如果要判斷當(dāng)前實(shí)例對(duì)應(yīng)的時(shí)間,是否在其他兩個(gè)實(shí)例對(duì)應(yīng)的時(shí)間之間,可以用 between() 方法。如果提供了第三個(gè)參數(shù),并且為 true,將會(huì)進(jìn)行 >= 和 <= 的操作。如果為 false,會(huì)進(jìn)行 > 和 < 的操作。該參數(shù)默認(rèn)是 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() 將會(huì)返回兩個(gè)實(shí)例中時(shí)間較早的實(shí)例,max() 返回時(shí)間較晚的那個(gè)。如果沒(méi)有提供給 min() 或 max() 任何參數(shù),將會(huì)拿當(dāng)前時(shí)間和調(diào)用該方法的實(shí)例進(jìn)行比較。
$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:34Carbon 提供了一些見(jiàn)名知意的輔助方法去處理大部分用到的場(chǎng)景。需要執(zhí)行比較操作的方法都會(huì)與當(dāng)前時(shí)區(qū)的當(dāng)前時(shí)間進(jìn)行比較。
$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!Addition and Subtraction默認(rèn)的DateTime類(lèi)提供了一對(duì)方便增加和減少時(shí)間的方法。有 modify(),add() 和 sub() 。modify() 方法接受一個(gè)標(biāo)準(zhǔn)的 data/time 字符串,該方法會(huì)對(duì)字符串進(jìn)行解析,當(dāng)牽扯到 add() 和 sub() 時(shí)會(huì)隱式調(diào)用DateInterval類(lèi)進(jìn)行處理。用鏈?zhǔn)秸{(diào)用的方式進(jìn)行操作,代碼將會(huì)更加的清晰和易讀。當(dāng)然,由于繼承關(guān)系這并不會(huì)影響你使用底層的方法進(jì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當(dāng)然你也可以傳遞負(fù)值到addXXX()方法,實(shí)際這正是subXXX()方法所實(shí)現(xiàn)的功能。
Difference以下方法總是返回兩個(gè)實(shí)例之間的時(shí)間差。與基類(lèi)中的 diff() 方法不同的是,diff() 方法會(huì)通過(guò)DateInterval實(shí)例將61秒轉(zhuǎn)化成1分1秒來(lái)返回。下邊的這些方法第一個(gè)參數(shù)是將會(huì)用來(lái)比較的 Carbon 實(shí)例,默認(rèn)為 now() 方法創(chuàng)建的當(dāng)前時(shí)間實(shí)例。第二個(gè)參數(shù)也是可選的,指明了你是否需要返回一個(gè)比較結(jié)果的絕對(duì)值,默認(rèn)為 true,當(dāng)?shù)诙€(gè)參數(shù)為 false,并且用于比較的實(shí)例時(shí)間早于被比較的實(shí)例時(shí),返回負(fù)數(shù)。所有的比較操作都在UTC時(shí)區(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一些特殊的過(guò)濾方法,像 diffInDaysFiltered() 、diffInHoursFiltered() 和 diffFiltered() ,可以幫助你過(guò)濾時(shí)間差中的 days 、hour 或者一個(gè)自定義的時(shí)間間隔。下邊是統(tǒng)計(jì)兩個(gè)實(shí)例之間的周末天數(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()Difference for Humans對(duì)于人們來(lái)說(shuō),一月前比30天前更加易與理解。這是一個(gè)常見(jiàn)的方法在許多日期處理類(lèi)庫(kù)中,所以他想也應(yīng)該把這個(gè)加進(jìn)來(lái)。這里把一個(gè)月看做四周,這些方法需要一個(gè)可選的 Carbon 實(shí)例作為參數(shù)來(lái)進(jìn)行比較,默認(rèn)為當(dāng)前時(shí)間的實(shí)例。
這些方法會(huì)在兩個(gè)時(shí)間差值后增加一寫(xiě)描述,可能類(lèi)似下邊這四種:
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
你也可以傳遞第二個(gè)參數(shù)去掉類(lèi)似 ago,from now 這種修飾符,類(lèi)似這樣的用法 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你也通過(guò)在 diffForHumans() 被調(diào)用前,使用 Carbon::setLocale(‘fr’) 來(lái)改變語(yǔ)言設(shè)置。詳細(xì)請(qǐng)參考 localization 部分。
ModifiersCarbon argument.這些方法組對(duì)修改當(dāng)前實(shí)例很有幫助。你會(huì)注意到 startOfXXX(),next(),和 previous() 方法將會(huì)設(shè)置時(shí)間為 00:00:00,另外 endOfXXX() 方法將會(huì)設(shè)置時(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()ConstantsCarbon 中定義了以下常量。
// 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!"; }CarbonIntervalCarbon 類(lèi)繼承了PHP 的DateInterval類(lèi)。
你也可以通過(guò)一下方法創(chuàng)建一個(gè)實(shí)例。
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 實(shí)例來(lái)自其他類(lèi)庫(kù),別怕,通過(guò) instance() 這種友好的方式你手動(dòng)可以創(chuàng)建一個(gè) CarbonInterval 實(shí)例。
$di = new DateInterval("P1Y2M"); // <== instance from another API $ci = CarbonInterval::instance($di); echo get_class($ci); // "CarbonCarbonInterval" echo $ci; // 1 year 2 months其他的一些輔助方法,但要注意這些輔助方法處理周時(shí),只有天會(huì)被保存下來(lái)。并且是在當(dāng)前實(shí)例的總天數(shù)基礎(chǔ)上計(jì)算周。
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也有一個(gè)方便的 forHumans(),在調(diào)用 __toString() 方法時(shí),自動(dòng)執(zhí)行,并打印出可讀性更好的時(shí)間格式。
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");當(dāng)然,你可以通過(guò) CarbonInterval::setLocale(‘fr’) 來(lái)改變語(yǔ)言顯示。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/26304.html
摘要:原文地址中文文檔介紹是的日期處理類(lèi)庫(kù)。例如作者所在的時(shí)區(qū)為東京時(shí)間減小時(shí),因此在下午一點(diǎn)后。最后提到的這兩個(gè)方法都是處理時(shí)間戳的。以下是當(dāng)前支持的時(shí)間轉(zhuǎn)換字值得注意的是像和方法等相關(guān)的修改會(huì)把日期的時(shí)間部分設(shè)置成。 原文地址 : Carbon中文文檔 介紹 Carbon 是php的日期處理類(lèi)庫(kù)(A simple PHP API extension for DateTime.)。 Car...
摘要:現(xiàn)在面向所有人正式發(fā)布了。并且有計(jì)劃將作為可選擴(kuò)展包發(fā)布,你仍然可以在項(xiàng)目中使用它們。是最新的穩(wěn)定版本,將在年月左右處理收到的錯(cuò)誤修復(fù)和更新,并在年月左右之前進(jìn)行安全修復(fù)。中文翻譯中文翻譯已啟動(dòng),請(qǐng)關(guān)注更多翻譯文章請(qǐng)見(jiàn)開(kāi)發(fā)者社區(qū) showImg(https://segmentfault.com/img/remote/1460000018318895?w=1680&h=859); Lar...
摘要:它是專(zhuān)門(mén)用來(lái)處理和時(shí)間相關(guān)的類(lèi),除了這里用到的實(shí)例化時(shí)間計(jì)算時(shí)間等,還有很多實(shí)用的功能,在參考資料中有相關(guān)鏈接,可以查看。 導(dǎo)語(yǔ) 這個(gè)需求是這樣的,我的電飯鍋有定時(shí)功能,第二天早上想要喝粥的話,就要設(shè)置倒計(jì)時(shí),每次就要算一下要設(shè)置多少時(shí)間,干脆就寫(xiě)個(gè)代碼好了。很簡(jiǎn)單的功能,不值得寫(xiě)一篇,另一個(gè)目的其實(shí)是記錄一下從開(kāi)發(fā)到提交 GitHub 的流程。代碼可查看 GitHub。 本地開(kāi)發(fā) 先...
摘要:將上述的一系列查詢進(jìn)行封裝模型到了這一步,我們基本上實(shí)現(xiàn)了文章歸檔的功能。但是有一個(gè)問(wèn)題,文章歸檔實(shí)際上包括在通用視圖中,這就意味著,網(wǎng)站的所有請(qǐng)求都需要返回,否則就會(huì)報(bào)錯(cuò)。數(shù)據(jù)庫(kù)之?dāng)?shù)據(jù)庫(kù)請(qǐng)求構(gòu)建器中文文檔的視圖功能中文文檔 首先,要實(shí)現(xiàn)的是按照日期來(lái)統(tǒng)計(jì)文章,原始的 SQL 如下: select year(created_at) year, monthname(c...
摘要:年開(kāi)發(fā)者應(yīng)該熟練使用,并且知道版本更新內(nèi)容。對(duì)開(kāi)發(fā)和運(yùn)維人員來(lái)說(shuō),最希望的就是一次性創(chuàng)建或配置,可以在任意地方正常運(yùn)行。是標(biāo)準(zhǔn)規(guī)范,是開(kāi)發(fā)的實(shí)踐標(biāo)準(zhǔn)。對(duì)開(kāi)發(fā)者來(lái)說(shuō)語(yǔ)言推薦和,全棧的選擇非常多,推薦熱門(mén)的 前言 在前天(2018-08-02)已經(jīng)發(fā)布了PHP 7.3.0.beta1 Released 如果你還沒(méi)有使用 PHP7 ,那真的很遺憾。2018年P(guān)HP開(kāi)發(fā)者應(yīng)該熟練使用 PHP7...
閱讀 3577·2021-11-24 10:19
閱讀 3710·2021-09-30 09:47
閱讀 1282·2019-08-30 15:56
閱讀 780·2019-08-29 15:11
閱讀 893·2019-08-29 13:43
閱讀 3557·2019-08-28 18:25
閱讀 2149·2019-08-26 13:27
閱讀 1427·2019-08-26 11:44