您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

聊聊Laravel Carbon扩展包的作用及用法

2025/12/8 6:34:01发布19次查看
下面由laravel教程栏目带大家推荐介绍关于laravel carbon 扩展包,希望对大家有所帮助!
introductioncarbon *继承了php的 *datetime *类和jsonserialiable。所以 *carbon *中没有涉及到的,但在 *datetime *和jsonserializable*中已经实现的方法都是可以使用的。
 class  carbon  extends  datetime  implements  jsonserializable { //code here}
carbon 类声明在 carbon 命名空间下,可以通过引入命名空间的方式来代替每次输入完整的类名。
  <?php use carbon\carbon;
要特别留意是否使用了正确的时区,比如的所有差异比较都使用或者系统设定的时区
$dttoronto = carbon::create(2012, 1, 1, 0, 0, 0, 'america/toronto'); $dtvancouver = carbon::create(2012, 1, 1, 0, 0, 0, 'america/vancouver'); echo $dtvancouver->diffinhours($dttoronto);  //
以上进行的时间比较是在提供的 carbon 实例所在的时区下完成的。例如作者所在的时区为 东京时间减13 小时,因此在下午一点后。carbon::now(‘asia/tokyo’)->istoday() 将会返回 false ,如果在调用 now() 时设置时区为东京时区,接下来的操作都使用东京时区是说不过去的。所以在与 *now() *创建的实例进行比较时,默认是在当前时区下完成的。
instantiation有几种不同的方法可以创建一个新的carbon实例。首先是构造函数。它覆盖父构造函数,您最好阅读php手册中的第一个参数,并了解它所接受的日期/时间字符串格式。您可能会发现自己很少使用构造函数,而是依赖于显式静态方法来提高可读性
 $carbon =  new  carbon();  // 等同于 carbon::now()  $carbon =  new  carbon('first day of january 2008',  'america/vancouver'); echo get_class($carbon);  // 'carbon\carbon' $carbon =  carbon::now(-5);//1表示英国伦敦,2表示法国巴黎
您将在上面注意到,timezone(2nd)参数是作为字符串和整数而不是\datetimezone实例传递的。所有datetimezone参数都已被增强,因此您可以将一个datetimezone实例、字符串或整型偏移量传递给gmt,并为您创建时区。在下一个示例中再次显示了这一点,该示例还介绍了now()函数。
  $nowinlondontz =  carbon::now(new \datetimezone('europe/london'));  // 或者以字符串形式只传时区  $nowinlondontz =  carbon::now('europe/london');// 或者在dst期间创建一个时区为+1到gmt的日期,然后传递一个整数echo carbon::now(1)->tzname;  // europe/london
如果您真的喜欢您的动态方法调用,并且对使用构造函数时所需的额外的行或难看的括号感到失望,那么您将喜欢parse方法。
 echo (new  carbon('first day of december 2008'))->addweeks(2);  // 2008-12-15 00:00:00 echo carbon::parse('first day of december 2008')->addweeks(2);  // 2008-12-15 00:00:00
note*:在php 5.4* 之前(new myclass())->method()会报语法错误**, 如果你使用**php 5.3, 你需要创建一个变量然后再调用方法:
  $date =  new  carbon('first day of december 2008');    echo $date->addweeks(2);
传递给carbon:::parse或new carbon的字符串可以表示相对时间(next sunday, tomorrow, first day of next month, last year)或绝对时间(first day of december 2008, 2017-01-06)。您可以用carbon::hasrelativekeywords()测试一个字符串是否会产生一个相对或绝对日期。
  $string =  'first day of next month';  if  (strtotime($string)  ===  false)  { echo '$string' is not a valid date/time string.;  } elseif (carbon::hasrelativekeywords($string))  { echo '$string' is a relative valid date/time string, it will returns different dates depending on the current date.; }  else  {  echo '$string' is an absolute date/time string, it will always returns the same date.; }
为了配合now(),还存在一些静态的实例化助手来创建广为人知的实例。这里唯一需要注意的是,today()、tomorrow()和yesterday()除了按照预期的行为,都接受一个时区参数,每个参数的时间值都设置为00:00:00。
 $now =  carbon::now(); echo $now;  // 2018-07-26 16:25:49 $today =  carbon::today();  echo $today;  // 2018-07-26 00:00:00  $tomorrow =  carbon::tomorrow('europe/london');  echo $tomorrow;  // 2018-07-27 00:00:00  $yesterday =  carbon::yesterday();  echo $yesterday;  // 2018-07-25 00:00:00
下一组静态助手是createxxx() 函数。大多数静态create函数允许您提供许多个或少量的参数,并为所有其他参数提供默认值。通常默认值是当前日期、时间或时区。更高的值将适当地包装,但无效的值将抛出一个invalidargumentexception,并附带一条信息。错误消息从datetime:::getlasterrors()调用中获取。
  carbon::createfromdate($year, $month, $day, $tz);  carbon::createfromtime($hour, $minute, $second, $tz); carbon::createfromtimestring($hour:$minute:$second, $tz);  carbon::create($year, $month, $day, $hour, $minute, $second, $tz);
createfromdate() 的默认值是当前时间. createfromtime() 默认值是今天. create()如果不传参数也是当前时间. 与前面一样,$tz默认设置为当前时区,否则可以是datetimezone实例,也可以是字符串时区值。默认值(模拟底层php库)的唯一特殊情况发生在指定了小时值但没有分钟或秒时,它们将默认为0。
注:***createfromtime()** will default the date to today**。小编经实战代码打印出来发现**createfromtime()**的默认值也是当前时间,不是今天(时分秒并不是**00:00:00**)。***
 $xmasthisyear =  carbon::createfromdate(null,  12,  25);  // year默认值是今年 $y2k =  carbon::create(2000,  1,  1,  0,  0,  0);  // 等价于carbon::createmidnightdate(2000, 1, 1)  $alsoy2k =  carbon::create(1999,  12,  31,  24);  $noonlondontz =  carbon::createfromtime(12,  0,  0,  'europe/london');  $teatime =  carbon::createfromtimestring('17:00:00',  'europe/london'); // a two digit minute could not be found  try  {      carbon::create(1975,  5,  21,  22,  -2,  0);  }  catch(\invalidargumentexception $x)  {     echo $x->getmessage()}
创建异常发生在使用负值上,而不是在溢出上,要获取溢出上的异常,请使用createsafe()
echo carbon::create(2000,  1,  35,  13,  0,  0);// 2000-02-04 13:00:00 //(1月有31天,4天自动加上去转换成了2月4号)  try  {  carbon::createsafe(2000,  1,  35,  13,  0,  0);  }  catch  (\carbon\exceptions\invaliddateexception $exp)  { echo $exp->getmessage(); }// 会报错:day : 35 is not a valid value.
note1:2018-02-29会产生一个异常,而2020-02-29不会产生异常,因为2020年是闰年。
note2:carbon::createsafe(2014,3,30,1,30,0,’europe/london’);从php 5.4开始也会产生一个异常,因为在夏令时跳过一个小时,但是在php 5.4之前,它只会创建这个无效的日期。
 carbon::createfromformat($format, $time, $tz);
createfromformat()是最基本的php函数datetime:::createfromformat的包装器。不同的是,$tz参数可以是datetimezone实例或字符串时区值。此外,如果格式有错误,这个函数将调用datetime::getlasterrors()方法,然后抛出一个invalidargumentexception,错误作为消息。如果您查看上面的createxx()函数的源代码,它们都会调用createfromformat()。
 echo carbon::createfromformat('y-m-d h',  '1975-05-21 22')->todatetimestring();  // 1975-05-21 22:00:00
最后三个create函数用于使用unix时间戳。第一个将创建一个与给定的时间戳相等的carbon实例,并将设置时区或默认为当前时区。第二个createfromtimestamputc()是不同的,因为时区将保持utc(gmt)。第二种方法与carbon: createfromformat(‘@’.$timestamp)的作用相同,但我只是让它更明确了一点。第三个是createfromtimestampms(),它接受以毫秒而不是秒为单位的时间戳。也允许使用负时间戳。
 echo carbon::createfromtimestamp(-1)->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:59echo carbon::createfromtimestampms(1)->format('y-m-d\th:i:s.up t');  // 1969-12-31t19:00:00.001000-05:00 est echo carbon::createfromtimestampms(1,  'europe/london')->format('y-m-d\th:i:s.up t');  // 1970-01-01t01:00:00.001000+01:00 bst
您还可以copy()在现有carbon实例上创建。如预期的那样,日期、时间和时区值都被复制到新实例。
 $dt =  carbon::now(); echo $dt->diffinyears($dt->copy()->addyear());  // 1
// $dt 实例没有改变,任然是carbon:now()
您可以在现有的carbon实例上使用nowwithsametz()来在相同的时区中获取一个新的实例。
 $meeting =  carbon::createfromtime(19,  15,  00,  'africa/johannesburg');// 19:15 in johannesburg echo 'meeting starts at '.$meeting->format('h:i').' in johannesburg.';  // meeting starts at 19:15 in johannesburg.// now in johannesburg echo it's .$meeting->nowwithsametz()->format('h:i').' right now in johannesburg.';  // it's 09:37 right now in johannesburg.
最后,如果您发现自己从另一个库继承了\datetime实例,不要害怕!您可以通过友好的instance()方法创建一个carbon实例。或者使用更灵活的方法make(),它可以从datetime、carbon或string返回一个新的carbon实例,否则它只返回null。
 $dt =  new \datetime('first day of january 2008');  // <== instance from another api $carbon = carbon::instance($dt); echo get_class($carbon); // 'carbon\carbon' echo $carbon->todatetimestring();  // 2008-01-01 00:00:00
关于微秒的简要说明。php datetime对象允许您设置一个微秒值,但是忽略它的所有日期数学。现在,1.12.0的carbon在实例化或复制操作过程中支持微秒,并在默认情况下使用format()方法。
$dt =  carbon::parse('1975-05-21 22:23:00.123456'); echo $dt->micro;  //  echo $dt->copy()->micro;  //
在php 7.1之前 datetime微秒未添加到“now”实例,并且之后不能更改,这意味着:
$date =  new  datetime('now'); echo $date->format('u'); // display current microtime in php >= 7.1 (expect a bug in php 7.1.3 only)// display 000000 before php 7.1  $date =  new  datetime('2001-01-01t00:00:00.123456z'); echo $date->format('u'); // display 123456 in all php versions$date->modify('00:00:00.987654');echo $date->format('u');// display 987654 in php >= 7.1// display 123456 before php 7.1
为了解决这个限制,我们在php < 7.1中调用了microseconds,但是这个特性在需要时可以被禁用(php >= 7.1):
carbon::usemicrosecondsfallback(false);var_dump(carbon::ismicrosecondsfallbackenabled());  // false echo carbon::now()->micro;  // 0 in php < 7.1, microtime in php >= 7.1carbon::usemicrosecondsfallback(true);  // default value var_dump(carbon::ismicrosecondsfallbackenabled());  // trueecho carbon::now()->micro;  // microtime in all php version
是否需要遍历一些日期以找到最早或最近的日期?不知道如何设置初始最大值/最小值?现在有两个助手可以帮助你做出简单的决定:
 echo carbon::maxvalue();  // '9999-12-31 23:59:59'echo carbon::minvalue();  // '0001-01-01 00:00:00'
最小和最大值主要取决于系统(32位或64位)。
使用32位os系统或32位版本的php(您可以在php中使用php_int_size == 4来检查它),最小值是0-unix-timestamp(1970-01-01 00:00:00),最大值是常量php_int_max给出的时间戳。
使用64位os系统和64位php版本,最小值为01-01 00:00,最大值为9999-12-31 23:59:59。
localization不幸的是,基类datetime没有任何本地化支持。为了开始本地化支持,还添加了一个formatlocalized($format)方法。实现使用当前实例时间戳对strftime进行调用。如果您首先使用php函数setlocale()设置当前的语言环境,那么返回的字符串将被格式化为正确的语言环境。
$newlocale = setlocale(lc_time,  'german'); if  ($newlocale ===  false)  { echo 'german locale is not installed on your machine, it may have a different name a different name on your machine or you may need to install it.'; }echo $dt->formatlocalized('%a %d %b %y');  // mittwoch 21 mai 1975 setlocale(lc_time,  'english'); echo $dt->formatlocalized('%a %d %b %y');  // wednesday 21 may 1975  setlocale(lc_time,  '');  // reset locale
diffforhumans()也被定位。您可以通过使用静态carbon::setlocale()函数来设置carbon locale(),并使用carbon::getlocale()获取当前的设置。
carbon::setlocale('de'); echo carbon::getlocale();  // de echo carbon::now()->addyear()->diffforhumans();  // in 1 jahr carbon::setlocale('en'); echo carbon::getlocale();  // en
或者,您可以将一些代码与给定的语言环境隔离:
  carbon::executewithlocale('de',  function  ($newlocale)  {  // you can optionally get $newlocale as the first argument of the closure  // it will be set to the new locale or false if the locale was not found. echo carbon::now()->addyear()->diffforhumans();  });  // in 1 jahr  // outside the function the locale did not change echo carbon::getlocale();  // en // or same using a return statement$french =  carbon::executewithlocale('fr',  function  ()  {return  carbon::now()->addyear()->diffforhumans();}); echo $french;  // dans 1 an
有些语言需要打印utf8编码(主要以. utf8结尾的语言环境包)。在本例中,您可以使用静态方法php
carbon::setutf8()对对utf8字符集的formatlocalized()调用的结果进行编码。  setlocale(lc_time,  'spanish');  $dt =  carbon::create(2016,  01,  06,  00,  00,  00); carbon::setutf8(false); echo $dt->formatlocalized('%a %d %b %y');  // mi�rcoles 06 enero 2016 carbon::setutf8(true); echo $dt->formatlocalized('%a %d %b %y');  // miércoles 06 enero 2016 carbon::setutf8(false);  setlocale(lc_time,  '');
在linux上
如果您在翻译方面有问题,请检查系统中安装的地区(本地和生产)。
区域设置-列出已启用的区域设置。
sudo locale-gen fr_fr。utf-8安装一个新的语言环境。
sudo dpkg-reconfigure locale来发布所有启用的locale。
并重启系统。
您可以通过以下方式自定义现有语言:
carbon::setlocale('en');  $translator =  carbon::gettranslator();  $translator->setmessages('en', array( 'day'  =>  ':count boring day|:count boring days',  )); $date1 =  carbon::create(2018,  1,  1,  0,  0,  0); $date2 =  carbon::create(2018,  1,  4,  4,  0,  0); echo $date1->diffforhumans($date2,  true,  false,  2);  // 3 boring days 4 hours$translator->resetmessages('en');  // reset language customizations for en language
请注意,您还可以使用另一个转换器carbon::settranslator($custom),只要给定的转换器继承了symfony\component\translation\translatorinterface。 因此,对格式本地化、getter(如localemonth、localedayayofweek和短变体)的语言环境支持是由安装在操作系统中的语言环境驱动的。对于其他翻译,由于碳社区的支持,它在内部得到了支持。您可以使用以下方法检查支持的内容:
 echo implode(', ', array_slice(carbon::getavailablelocales(),  0,  3)).'...';  // af, ar, ar_shakl... // support diff syntax (before, after, from now, ago) var_dump(carbon::localehasdiffsyntax('en'));  // bool(true)  var_dump(carbon::localehasdiffsyntax('zh_tw'));  // bool(true) // support 1-day diff words (just now, yesterday, tomorrow) var_dump(carbon::localehasdiffonedaywords('en'));  // bool(true)  var_dump(carbon::localehasdiffonedaywords('zh_tw'));  // bool(false) // support 2-days diff words (before yesterday, after tomorrow)var_dump(carbon::localehasdifftwodaywords('en'));  // bool(true) var_dump(carbon::localehasdifftwodaywords('zh_tw'));  // bool(false) // support short units (1y = 1 year, 1mo = 1 month, etc.) var_dump(carbon::localehasshortunits('en'));  // bool(true)var_dump(carbon::localehasshortunits('zh_tw'));  // bool(false)// support period syntax (x times, every x, from x, to x)var_dump(carbon::localehasperiodsyntax('en'));  // bool(true)var_dump(carbon::localehasperiodsyntax('zh_tw'));  // bool(false)
以下是最后一个碳版本支持的73个地区的概述:
注意,如果您使用laravel 5.5+,语言环境将根据当前的最后一个app:setlocale execution自动设置。所以扩散人类将是透明的。您可能仍然需要在某些中间件中运行setlocale以使formatlocalizedworking正确。
testing aids测试方法允许您在创建“现在”实例时设置要返回的carbon实例(real或mock)。所提供的实例将在以下条件下具体返回:
对static now()方法的调用,例如:now()
当一个空(或空字符串)被传递给构造函数或parse()时,ex.new carbon(空)
当字符串“now”传递给构造函数或parse()时,ex. new carbon(‘now’)
给定的实例也将作为diff方法的默认相对时间。
 $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::gettestnow();  // 2001-05-21 12:00:00  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  echo carbon::create(2001,  4,  21,  12)->diffforhumans();  // 1 month agovar_dump(carbon::hastestnow());  // bool(true) carbon::settestnow();  // clear the mock var_dump(carbon::hastestnow());  // bool(false)echo carbon::now();  // 2018-07-05 03:37:12
一个更有意义的完整例子:
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();  //carbon::settestnow(carbon::parse('first day of december 2000')); echo $product->getprice();  // carbon::settestnow(carbon::parse('first day of may 2000')); echo $product->getprice();  // carbon::settestnow();
根据给定的“now”实例,还可以对相关短语进行嘲笑。
 $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();  // always clear it !
被认为是相对修饰语的单词列表如下:
+-agofirstnextlastthistodaytomorrowyesterday请注意,与next()、previous()和modify()方法类似,这些相对修饰符中的一些将把时间设置为00:00。
carbon: parse($time, $tz)和new carbon($time, $tz)都可以将时区作为第二个参数。 echo carbon::parse('2012-9-5 23:26:11.223',  'europe/paris')->timezone->getname();  // europe/paris
gettersgetter方法是通过php的__get()方法实现的。这使您能够像访问属性而不是函数调用那样访问值。
$dt =  carbon::parse('2012-10-5 23:26:11.123789');  // 这些getter方法都将返回int类型 var_dump($dt->year);  // int(2012)var_dump($dt->month);  // int(10) 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)// dayofweek 返回一个数值 0 (sunday) 到 6 (saturday) var_dump($dt->dayofweek);  // int(5)// dayofweekiso 返回一个数值 1 (monday) 到 7 (sunday) var_dump($dt->dayofweekiso);  // int(5) setlocale(lc_time,  'german');var_dump($dt->englishdayofweek);  // string(6) fridayvar_dump($dt->shortenglishdayofweek);  // string(3) frivar_dump($dt->localedayofweek);  // string(7) freitagvar_dump($dt->shortlocaledayofweek);  // string(2) frvar_dump($dt->englishmonth);  // string(7) octobervar_dump($dt->shortenglishmonth);  // string(3) octvar_dump($dt->localemonth);  // string(7) oktobervar_dump($dt->shortlocalemonth);  // string(3) oktsetlocale(lc_time,  '');var_dump($dt->dayofyear);  // int(278)var_dump($dt->weeknumberinmonth);// weeknumberinmonth consider weeks from monday to sunday, so the week 1 will// contain 1 day if the month start with a sunday, and up to 7 if it starts with a mondayvar_dump($dt->weekofmonth);  // int(1)// weekofmonth will returns 1 for the 7 first days of the month, then 2 from the 8th to// the 14th, 3 from the 15th to the 21st, 4 from 22nd to 28th and 5 above var_dump($dt->weekofyear);  // int(40) var_dump($dt->daysinmonth);  // int(31) var_dump($dt->timestamp);  // int(1349493971) var_dump(carbon::createfromdate(1975,  5,  21)->age);  // int(43) calculated vs now in the same tzvar_dump($dt->quarter);  // int(4) // 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 timezonevar_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 instanceecho 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
setters下面的setter是通过php的__set()方法实现的。值得注意的是,除了显式地设置时区之外,任何设置程序都不会更改实例的时区。具体地说,设置时间戳不会将相应的时区设置为utc。
 $dt =  carbon::now();$dt->year =  1975; $dt->month =  13;  //强制 year++ 然后 month = 1  $dt->month =  5;  $dt->day =  21; $dt->hour =  22; $dt->minute =  32;  $dt->second =  5; $dt->timestamp =  169957925;  // 这不会改变时区 // 通过datetimezone实例或字符串设置时区 $dt->timezone =  new  datetimezone('europe/london');$dt->timezone =  'europe/london';$dt->tz =  'europe/london';
fluent setters对于setter没有可选参数,但是函数定义中有足够的多样性,因此无论如何都不需要它们。值得注意的是,除了显式地设置时区之外,任何设置程序都不会更改实例的时区。具体地说,设置时间戳不会将相应的时区设置为utc。
 $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->setdate(1975,  5,  21)->settimefromtimestring('22:32:05')->todatetimestring();  $dt->setdatetime(1975,  5,  21,  22,  32,  5)->todatetimestring(); $dt->timestamp(169957925)->timezone('europe/london'); $dt->tz('america/toronto')->settimezone('america/vancouver');
您还可以将日期和时间与其他datetime/carbon对象分开设置:
 $source1 =  new  carbon('2010-05-16 22:40:10'); $dt =  new  carbon('2001-01-01 01:01:01'); $dt->settimefrom($source1);echo $dt;  // 2001-01-01 22:40:10  $source2 =  new  datetime('2013-09-01 09:22:56');$dt->setdatefrom($source2);echo $dt;  // 2013-09-01 22:40:10
isset实现了php函数isset()。这是在一些外部系统(例如twig)在使用属性之前验证属性的存在时完成的。这是使用isset()或empty()方法完成的。在php站点:isset()、isset()、empty()上,您可以阅读更多关于这些内容的信息。
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所有可用的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 availableecho $dt->format('l js \\of f y h:i:s a');  // thursday 25th of december 1975 02:15:16 pm // the reverse hasformat method allows you to test if a string looks like a given format var_dump($dt->hasformat('thursday 25th december 1975 02:15:16 pm',  'l js f y h:i:s a'));  // bool(true)
您还可以设置默认的__tostring()格式(默认为y-m-d hs),这是在发生类型杂耍时使用的格式。
carbon::settostringformat('js \o\f f, y g:i:s a'); echo $dt;  // 25th of december, 1975 2:15:16 pmcarbon::resettostringformat();  echo $dt;  // 1975-12-25 14:15:16
note:对于本地化支持,请参阅本地化部分。
common formats下面是datetime类中提供的公共格式的包装器。
  $dt =  carbon::createfromformat('y-m-d h:i:s.u',  '2019-02-01 03:45:27.612584'); // $dt->toatomstring() is the same as $dt->format(datetime::atom); echo $dt->toatomstring();  // 2019-02-01t03:45:27-05:00  echo $dt->tocookiestring();  // friday, 01-feb-2019 03:45:27 est  echo $dt->toiso8601string();  // 2019-02-01t03:45:27-05:00  // be aware we chose to use the full-extended format of the iso 8601 norm  // natively, datetime::iso8601 format is not compatible with iso-8601 as it// is explained here in the php documentation: // https://php.net/manual/class.datetime.php#datetime.constants.iso8601 // we consider it as a php mistake and chose not to provide method for this // format, but you still can use it this way: echo $dt->format(datetime::iso8601);  // 2019-02-01t03:45:27-0500 echo $dt->toiso8601zulustring();  // 2019-02-01t08:45:27z echo $dt->torfc822string();  // fri, 01 feb 19 03:45:27 -0500echo $dt->torfc850string();  // friday, 01-feb-19 03:45:27 est echo $dt->torfc1036string();  // fri, 01 feb 19 03:45:27 -0500 echo $dt->torfc1123string();  // fri, 01 feb 2019 03:45:27 -0500 echo $dt->torfc2822string();  // fri, 01 feb 2019 03:45:27 -0500 echo $dt->torfc3339string();  // 2019-02-01t03:45:27-05:00 echo $dt->torfc7231string();  // fri, 01 feb 2019 08:45:27 gmt echo $dt->torssstring();  // fri, 01 feb 2019 03:45:27 -0500 echo $dt->tow3cstring();  // 2019-02-01t03:45:27-05:00 var_dump($dt->toarray());/* array(12) { [year]=>int(2019)[month]=>int(2)[day]=>int(1)[dayofweek]=>int(5)[dayofyear]=> int(31) [hour]=> int(3) [minute]=>int(45)[second]=> int(27)[micro]=>int(612584)[timestamp]=>int(1549010727)[formatted]=> string(19) 2019-02-01 03:45:27 [timezone]=>object(datetimezone)#118 (2) {[timezone_type]=> int(3) [timezone]=> string(15) america/toronto } }*/
comparison通过以下函数提供了简单的比较。请记住,比较是在utc时区进行的,所以事情并不总是像看上去的那样。
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:11echo $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) // all have verbose aliases and php equivalent code: var_dump($first->eq($second));  // bool(false) var_dump($first->equalto($second));  // bool(false) var_dump($first == $second);  // bool(false)var_dump($first->ne($second));  // bool(true) var_dump($first->notequalto($second));  // bool(true)var_dump($first != $second);  // bool(true)var_dump($first->gt($second));  // bool(false) var_dump($first->greaterthan($second));  // bool(false)var_dump($first > $second);  // bool(false) var_dump($first->gte($second));  // bool(false) var_dump($first->greaterthanorequalto($second));  // bool(false) var_dump($first >= $second);  // bool(false)var_dump($first->lt($second));  // bool(true)var_dump($first->lessthan($second));  // bool(true)var_dump($first < $second); // bool(true) var_dump($first->lte($second));  // bool(true) var_dump($first->lessthanorequalto($second));  // bool(true) var_dump($first <= $second); // bool(true)
这些方法使用php $date1 == $date2提供的自然比较,因此在php 7.1之前,所有方法都将忽略milli/micro-seconds,然后从7.1开始考虑它们。
要确定当前实例是否在其他两个实例之间,可以使用恰当命名的between()方法。第三个参数表示是否应该进行相等的比较。默认值是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()方法或minimum()和maximum()别名所覆盖。与往常一样,如果指定为null,则默认参数现在为。
  $dt1 =  carbon::createmidnightdate(2012,  1,  1); $dt2 =  carbon::createmidnightdate(2014,  1,  30);  echo $dt1->min($dt2);  // 2012-01-01 00:00:00  echo $dt1->minimum($dt2);  // 2012-01-01 00:00:00  $dt1 =  carbon::createmidnightdate(2012,  1,  1);  $dt2 =  carbon::createmidnightdate(2014,  1,  30); echo $dt1->max($dt2);  // 2014-01-30 00:00:00  echo $dt1->maximum($dt2);  // 2014-01-30 00:00:00// now is the default param $dt1 =  carbon::createmidnightdate(2000,  1,  1); echo $dt1->max();  // 2018-07-05 03:37:12 echo $dt1->maximum();  // 2018-07-05 03:37:12$dt1 =  carbon::createmidnightdate(2010,  4,  1);$dt2 =  carbon::createmidnightdate(2010,  3,  28); $dt3 =  carbon::createmidnightdate(2010,  4,  16); // returns the closest of two date (no matter before or after) echo $dt1->closest($dt2, $dt3);  // 2010-03-28 00:00:00 echo $dt2->closest($dt1, $dt3);  // 2010-04-01 00:00:00 echo $dt3->closest($dt2, $dt1);  // 2010-04-01 00:00:00 // returns the farthest of two date (no matter before or after) echo $dt1->farthest($dt2, $dt3);  // 2010-04-16 00:00:00 echo $dt2->farthest($dt1, $dt3);  // 2010-04-16 00:00:00. echo $dt3->farthest($dt2, $dt1);  // 2010-03-28 00:00:00
为了处理最常用的情况,这里有一些简单的帮助函数,希望它们的名称能很明显地反映出来。对于以某种方式与now() (ex.istoday()))进行比较的方法,now()是在与实例相同的时区创建的。
 $dt =  carbon::now(); $dt2 =  carbon::createfromdate(1987,  4,  23);  $dt->issameas('w', $dt2);  // w is the date of the week, so this will return true if $dt and $dt2  // the same day of week (both monday or both sunday, etc.)  // you can use any format and combine as much as you want.$dt->isfuture(); $dt->ispast();$dt->issameyear($dt2); $dt->iscurrentyear(); $dt->isnextyear(); $dt->islastyear(); $dt->islongyear();  // see https://en.wikipedia.org/wiki/iso_8601#week_dates $dt->isleapyear();$dt->issamequarter($dt2);  // same quarter (3 months) no matter the year of the given date$dt->issamequarter($dt2,  true);  // same quarter of the same year of the given date/*alternatively, you can run carbon::compareyearwithmonth() to compare both quarter and year by default, in this case you can use $dt->issamequarter($dt2, false) to compare ignoring the year run carbon::compareyearwithmonth(false) to reset to the default behaviorrun carbon::shouldcompareyearwithmonth() to get the current setting */$dt->iscurrentquarter(); $dt->isnextquarter();  // date is in the next quarter $dt->islastquarter();  // in previous quarter $dt->issamemonth($dt2);  // same month no matter the year of the given date $dt->issamemonth($dt2,  true);  // same month of the same year of the given date/* as for issamequarter, you can run carbon::compareyearwithmonth() to compare both month and year by default,in this case you can use $dt->issamemonth($dt2, false) to compare ignoring the yearrun carbon::compareyearwithmonth(false) to reset to the default behaviorrun carbon::shouldcompareyearwithmonth() to get the current setting*/ $dt->iscurrentmonth(); $dt->isnextmonth(); $dt->islastmonth(); $dt->isweekday();$dt->isweekend(); $dt->ismonday(); $dt->istuesday();$dt->iswednesday(); $dt->isthursday(); $dt->isfriday(); $dt->issaturday(); $dt->issunday();$dt->isdayofweek(carbon::saturday);  // is a saturday$dt->islastofmonth();  // is the last day of the month $dt->issameday($dt2);  // same day of same month of same year $dt->iscurrentday(); $dt->isyesterday(); $dt->istoday();$dt->istomorrow(); $dt->isnextweek();$dt->islastweek(); $dt->issamehour($dt2); $dt->iscurrenthour();$dt->issameminute($dt2);$dt->iscurrentminute();$dt->issamesecond($dt2); $dt->iscurrentsecond();$dt->isstartofday();  // check if hour is 00:00:00$dt->ismidnight();  // check if hour is 00:00:00 (isstartofday alias) $dt->isendofday();  // check if hour is 23:59:59 $dt->ismidday();  // check if hour is 12:00:00 (or other midday hour set with carbon::setmiddayat())$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默认的datetime提供了几种不同的方法来方便地添加和减少时间。有modify()、add()和sub()。modify()使用一个魔术date/time格式字符串“last day of next month”,它解析并应用修改,而add()和sub()则期望一个不那么明显的日期间隔实例(例如新的\日期间隔(‘p6yt5m’)将意味着6年5分钟)。希望使用这些流畅的函数将会更加清晰,并且在几个星期内没有看到您的代码后更容易阅读。当然,我不会让您选择,因为基类函数仍然可用。
 $dt =  carbon::create(2012,  1,  31,  0);echo $dt->todatetimestring();  // 2012-01-31 00:00:00 echo $dt->addcenturies(5);  // 2512-01-31 00:00:00  echo $dt->addcentury();  // 2612-01-31 00:00:00  echo $dt->subcentury();  // 2512-01-31 00:00:00  echo $dt->subcenturies(5);  // 2012-01-31 00:00:00echo $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->addquarters(2);  // 2012-07-31 00:00:00echo $dt->addquarter();  // 2012-10-31 00:00:00 echo $dt->subquarter();  // 2012-07-31 00:00:00 echo $dt->subquarters(2);  // 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 wrapsecho $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:00echo $dt->addday();  // 2012-03-04 00:00:00 echo $dt->subday();  // 2012-03-03 00:00:00echo $dt->subdays(29);  // 2012-02-03 00:00:00echo $dt->addweekdays(4);  // 2012-02-09 00:00:00 echo $dt->addweekday();  // 2012-02-10 00:00:00echo $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:00echo $dt->subhour();  // 2012-02-04 00:00:00 echo $dt->subhours(24);  // 2012-02-03 00:00:00echo $dt->addminutes(61);  // 2012-02-03 01:01:00echo $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:00echo $dt->addseconds(61);  // 2012-02-03 00:01:01echo $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()实现的方式。 附注:如果你忘记并使用addday(5) 或subyear(3),我支持你; 默认情况下,carbon依赖于底层父类php datetime行为。因此,增加或减少月份可能会溢出,例如:
$dt =  carbon::create(2017,  1,  31,  0);echo $dt->copy()->addmonth();  // 2017-03-03 00:00:00 echo $dt->copy()->submonths(2);  // 2016-12-01 00:00:00
为了防止溢出carbon:usemonthverflow (false)
  carbon::usemonthsoverflow(false);  $dt =  carbon::createmidnightdate(2017,  1,  31); echo $dt->copy()->addmonth();  // 2017-02-28 00:00:00  echo $dt->copy()->submonths(2);  // 2016-11-30 00:00:00  // call the method with true to allow overflow again  carbon::resetmonthsoverflow();  // same as carbon::usemonthsoverflow(true);
方法carbon:::shouldoverflowmonths()允许您知道当前是否启用了溢出。您也可以使用->addmonthsnooverflow, ->submonthsnooverflow, ->addmonthswithoverflow, -> submonth withoverflow(或单数方法,不含s至“month”),显式add/sub,无论当前模式如何,都可以添加或不添加溢出。
 carbon::usemonthsoverflow(false); $dt =  carbon::createmidnightdate(2017,  1,  31); echo $dt->copy()->addmonthwithoverflow();  // 2017-03-03 00:00:00 // plural addmonthswithoverflow() method is also availableecho $dt->copy()->submonthswithoverflow(2);  // 2016-12-01 00:00:00  // singular submonthwithoverflow() method is also available echo $dt->copy()->addmonthnooverflow();  // 2017-02-28 00:00:00 // plural addmonthsnooverflow() method is also available echo $dt->copy()->submonthsnooverflow(2);  // 2016-11-30 00:00:00 // singular submonthnooverflow() method is also available echo $dt->copy()->addmonth();  // 2017-02-28 00:00:00echo $dt->copy()->submonths(2);  // 2016-11-30 00:00:00carbon::usemonthsoverflow(true);$dt =  carbon::createmidnightdate(2017,  1,  31); echo $dt->copy()->addmonthwithoverflow();  // 2017-03-03 00:00:00 echo $dt->copy()->submonthswithoverflow(2);  // 2016-12-01 00:00:00 echo $dt->copy()->addmonthnooverflow();  // 2017-02-28 00:00:00 echo $dt->copy()->submonthsnooverflow(2);  // 2016-11-30 00:00:00echo $dt->copy()->addmonth();  // 2017-03-03 00:00:00 echo $dt->copy()->submonths(2);  // 2016-12-01 00:00:00carbon::resetmonthsoverflow();
从1.23.0版本开始,在以下年份也可以使用溢出控制:
 carbon::useyearsoverflow(false);  $dt =  carbon::createmidnightdate(2020,  2,  29); var_dump(carbon::shouldoverflowyears());  // bool(false) echo $dt->copy()->addyearwithoverflow();  // 2021-03-01 00:00:00  // plural addyearswithoverflow() method is also available echo $dt->copy()->subyearswithoverflow(2);  // 2018-03-01 00:00:00// singular subyearwithoverflow() method is also availableecho $dt->copy()->addyearnooverflow();  // 2021-02-28 00:00:00// plural addyearsnooverflow() method is also available echo $dt->copy()->subyearsnooverflow(2);  // 2018-02-28 00:00:00// singular subyearnooverflow() method is also available echo $dt->copy()->addyear();  // 2021-02-28 00:00:00 echo $dt->copy()->subyears(2);  // 2018-02-28 00:00:00carbon::useyearsoverflow(true);$dt =  carbon::createmidnightdate(2020,  2,  29); var_dump(carbon::shouldoverflowyears());  // bool(true) echo $dt->copy()->addyearwithoverflow();  // 2021-03-01 00:00:00 echo $dt->copy()->subyearswithoverflow(2);  // 2018-03-01 00:00:00echo $dt->copy()->addyearnooverflow();  // 2021-02-28 00:00:00 echo $dt->copy()->subyearsnooverflow(2);  // 2018-02-28 00:00:00 echo $dt->copy()->addyear();  // 2021-03-01 00:00:00echo $dt->copy()->subyears(2);  // 2018-03-01 00:00:00carbon::resetyearsoverflow();
difference由于carbon继承了datetime,它继承了它的方法,如diff(),它将第二个date对象作为参数,并返回一个dateinterval实例。
我们还提供了diffascarboninterval(),类似于diff(),但返回一个carboninterval实例。检查carboninterval 章节了解更多信息。每个单元的carbon添加了diff方法,如diffinyears()、diffinmonths()等。diffascarboninterval()和diffin*()方法都可以使用两个可选参数:date to compare with(如果缺失,now是默认值),以及一个绝对布尔选项(默认为true),无论哪个日期大于另一个,该方法都返回一个绝对值。如果设置为false,则在调用方法的实例大于比较日期(第一个参数或now)时返回负值。注意,diff()原型是不同的:它的第一个参数(date)是强制性的,第二个参数(绝对选项)默认为false。
这些函数总是返回在指定的时间内表示的总差异。这与基类diff()函数不同,该函数的时间间隔为122秒,通过dateinterval实例返回2分零2秒。diffinminutes()函数只返回2,而diffinseconds()将返回122。所有的值都被截断而不是四舍五入。下面的每个函数都有一个默认的第一个参数,该参数是要比较的carbon实例,如果您想使用now(),则为null。第二个参数也是可选的,如果您希望返回值是绝对值,或者如果传递的日期小于当前实例,则返回值可能具有-(负)符号的相对值。这将默认为true,返回绝对值。
echo carbon::now('america/vancouver')->diffinseconds(carbon::now('europe/london'));  // $dtottawa =  carbon::createmidnightdate(2000,  1,  1,  'america/toronto'); $dtvancouver =  carbon::createmidnightdate(2000,  1,  1,  'america/vancouver'); echo $dtottawa->diffinhours($dtvancouver);  //echo $dtvancouver->diffinhours($dtottawa);  // echo $dtottawa->diffinhours($dtvancouver,  false);  // echo $dtvancouver->diffinhours($dtottawa,  false);  // -3 $dt =  carbon::createmidnightdate(2012,  1,  31); echo $dt->diffindays($dt->copy()->addmonth());  //echo $dt->diffindays($dt->copy()->submonth(),  false);  // -31$dt =  carbon::createmidnightdate(2012,  4,  30); echo $dt->diffindays($dt->copy()->addmonth());  //echo $dt->diffindays($dt->copy()->addweek());  // $dt =  carbon::createmidnightdate(2012,  1,  1);echo $dt->diffinminutes($dt->copy()->addseconds(59));  // echo $dt->diffinminutes($dt->copy()->addseconds(60));  //echo $dt->diffinminutes($dt->copy()->addseconds(119));  // echo $dt->diffinminutes($dt->copy()->addseconds(120));  // echo $dt->addseconds(120)->secondssincemidnight();  // $interval = $dt->diffascarboninterval($dt->copy()->subyears(3),  false); echo ($interval->invert ?  'minus '  :  'plus ')  . $interval->years;  // minus 3
关于夏令时(dst)的重要注意,默认情况下,php datetime不考虑dst,这意味着,像2014年3月30日这样只有23小时的一天在伦敦将被计算为24小时。
$date =  new  datetime('2014-03-30 00:00:00',  new  datetimezone('europe/london'));  // dst offecho $date->modify('+25 hours')->format('h:i');  // 01:00 (dst on, 24 hours only have been actually added)
carbon也遵循这种行为,增加/减少/降低秒/分钟/小时。但是我们提供了使用时间戳进行实时工作的方法:
 $date =  new  carbon('2014-03-30 00:00:00',  'europe/london');  // dst offecho $date->addrealhours(25)->format('h:i');  // 02:00 (dst on) echo $date->diffinrealhours('2014-03-30 00:00:00');  // echo $date->diffinhours('2014-03-30 00:00:00');  // echo $date->diffinrealminutes('2014-03-30 00:00:00');  //  echo $date->diffinminutes('2014-03-30 00:00:00');  //  echo $date->diffinrealseconds('2014-03-30 00:00:00');  //  echo $date->diffinseconds('2014-03-30 00:00:00');  // echo $date->subrealhours(25)->format('h:i');  // 00:00 (dst off)
同样的方法可以使用addrealminutes()、subrealminutes()、addrealseconds()、subrealseconds()和所有它们的唯一快捷方式:addrealhour()、subrealhour()、addrealmin()、subrealminute()、addrealsecond()、subrealsecond()。
还有特殊的过滤器函数diffindaysfilter()、diffinhoursfilter()和difffilter(),以帮助您按天数、小时或自定义间隔过滤差异。例如,计算两个实例之间的周末天数:
 $dt =  carbon::create(2014,  1,  1);  $dt2 =  carbon::create(2014,  12,  31); $daysforextracoding = $dt->diffindaysfiltered(function(carbon $date)  {  return $date->isweekend(); }, $dt2);  echo $daysforextracoding;  // $dt =  carbon::create(2014,  1,  1)->endofday(); $dt2 = $dt->copy()->startofday(); $littlehandrotations = $dt->difffiltered(carboninterval::minute(),  function(carbon $date)  {return $date->minute ===  0;}, $dt2,  true);  // true as last parameter returns absolute value echo $littlehandrotations;  //$date =  carbon::now()->addseconds(3666);echo $date->diffinseconds();  // echo $date->diffinminutes();  // echo $date->diffinhours();  //echo $date->diffindays();  //$date =  carbon::create(2016,  1,  5,  22,  40,  32); echo $date->secondssincemidnight();  //echo $date->secondsuntilendofday();  // $date1 =  carbon::createmidnightdate(2016,  1,  5);$date2 =  carbon::createmidnightdate(2017,  3,  15);echo $date1->diffindays($date2);  // echo $date1->diffinweekdays($date2);  //echo $date1->diffinweekenddays($date2);  // echo $date1->diffinweeks($date2);  // echo $date1->diffinmonths($date2);  // echo $date1->diffinyears($date2);  //
所有的diffin*滤波方法都采用1个可调用滤波器作为必要参数,一个date对象作为可选的第二个参数,如果缺失,使用now。您也可以将true作为第三个参数传递,以获得绝对值。
对于周/周末的高级处理,使用以下工具:
 echo implode(', ',  carbon::getdays());  // sunday, monday, tuesday, wednesday, thursday, friday, saturday  $saturday =  new  carbon('first saturday of 2019');$sunday =  new  carbon('first sunday of 2019');  $monday =  new  carbon('first monday of 2019'); echo implode(', ',  carbon::getweekenddays());  // 6, 0 var_dump($saturday->isweekend());  // bool(true) var_dump($sunday->isweekend());  // bool(true) var_dump($monday->isweekend());  // bool(false) carbon::setweekenddays(array(carbon::sunday,carbon::monday, ));  //自定义设置“周末” echo implode(', ',  carbon::getweekenddays());  // 0, 1 var_dump($saturday->isweekend());  // bool(false),周六返回falsevar_dump($sunday->isweekend());  // bool(true)var_dump($monday->isweekend());  // bool(true),周一返回truecarbon::setweekenddays(array(carbon::saturday, carbon::sunday, ));// weekend days and start/end of week or not linked carbon::setweekstartsat(carbon::friday); carbon::setweekendsat(carbon::wednesday);  // and it does not need neither to precede the startvar_dump(carbon::getweekstartsat()  ===  carbon::friday);  // bool(true) var_dump(carbon::getweekendsat()  ===  carbon::wednesday);  // bool(true)echo $saturday->copy()->startofweek()->torfc850string();  // friday, 06-jul-18 00:00:00 edt echo $saturday->copy()->endofweek()->torfc850string();  // wednesday, 11-jul-18 23:59:59 edt carbon::setweekstartsat(carbon::monday); carbon::setweekendsat(carbon::sunday); echo $saturday->copy()->startofweek()->torfc850string();  // monday, 02-jul-18 00:00:00 edt echo $saturday->copy()->endofweek()->torfc850string();  // sunday, 08-jul-18 23:59:59 edt
difference for humans对人类来说,一个月前比30天前更容易阅读。这是在大多数日期库中常见的函数,所以我也想在这里添加它。函数的唯一参数是另一个要对其进行diff的carbon实例,当然,如果没有指定,它默认为now()。
此方法将在相对于实例的差值和传入实例的差值之后添加短语。有4个可能性:
当将过去的值与现在的默认值进行比较时:
1小时前
5个月前
当将未来的值与现在的默认值进行比较时:
从现在开始的1小时
从现在开始的5个月
当比较一个过去的值与另一个值时:
前1小时
5个月前
当比较未来的价值与另一个价值时:
1小时后
5个月后
您还可以将true作为第二个参数传递,以便从现在开始删除修饰符,等等:diffforhuman ($other, true)。
如果在所使用的语言环境:diffforhuman ($other, false, true)中可用,您可以将true作为第三个参数传递给它,以使用简短语法。
您可以将1和6之间的数字作为第4个参数传递给diffforhuman ($other, false, false, 4)。
$other实例可以是datetime、carbon实例或任何实现datetimeinterface的对象,如果传递了一个字符串,它将被解析为获取一个carbon实例,如果传递了null,那么将使用carbon: now()。
  // 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 agoecho 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 nowecho carbon::now()->subdays(24)->diffforhumans();  // 3 weeks ago(21-27都返回这个,一个周的单位是7天,小于7直接舍去)echo carbon::now()->subdays(24)->diffforhumans(null,  true);  // 3 weeks(21-27都返回这个,一个周的单位是7天,小于7直接舍去)echo carbon::parse('2019-08-03')->diffforhumans('2019-08-13');  // 1 week before(时间间隔7-13天都是返回这个,一个周的单位是7天,小于7直接舍去)echo carbon::parse('2000-01-01 00:50:32')->diffforhumans('@946684800');  // 5 hours after(同理,都是舍去的)echo carbon::create(2018,  2,  26,  4,  29,  43)->diffforhumans(carbon::create(2016,  6,  21,  0,  0,  0),  false,  false,  6);  // 1 year 8 months 5 days 4 hours 29 minutes 43 seconds after
您还可以在调用diffforhuman()之前使用carbon::setlocale(‘fr’)更改字符串的locale。有关更多细节,请参见本地化部分。
可以通过以下方式启用/禁用diffforhuman()选项:
carbon::enablehumandiffoption(carbon::no_zero_diff); var_dump((bool)  (carbon::gethumandiffoptions()  &  carbon::no_zero_diff));  // bool(true)  carbon::disablehumandiffoption(carbon::no_zero_diff);  var_dump((bool)  (carbon::gethumandiffoptions()  &  carbon::no_zero_diff));  // bool(false)
可用的选项是:
carbon::no_zero_diff(默认启用):将空diff变为1秒carbon::just_now在默认情况下是禁用的):从现在开始变为“刚才”carbon:one_day_words(默认禁用):将“从现在/之前1天”变为“昨天/明天”carbon::two_day_words(默认禁用):将“从现在/之前2天”变为“昨天/之后”
carbon::just_now,carbon::one_day_words和carbon::two_day_words现在只能使用en和fr语言,其他语言将会恢复到以前的行为,直到添加缺失的翻译。
使用管道操作符一次启用/禁用多个选项,例如:one_day_words | carbon::two_day_words
您还可以使用sethumandiffoptions($options)禁用所有选项,然后只激活作为参数传递的选项。
modifiers这些方法组对当前实例进行了有益的修改。他们中的大多数方法的名字都是不言自明的……或者至少应该是这样。您还会注意到startofxxx()、next()和previous()方法将时间设置为00:00,endofxxx()方法将时间设置为23:59:59。
唯一稍有不同的是average()函数。它将实例移动到其本身和提供的碳参数之间的中间日期。
 $dt =  carbon::create(2012,  1,  31,  15,  32,  45); echo $dt->startofminute();  // 2012-01-31 15:32:00$dt =  carbon::create(2012,  1,  31,  15,  32,  45);  echo $dt->endofminute();  // 2012-01-31 15:32:59 $dt =  carbon::create(2012,  1,  31,  15,  32,  45);  echo $dt->startofhour();  // 2012-01-31 15:00:00$dt =  carbon::create(2012,  1,  31,  15,  32,  45); echo $dt->endofhour();  // 2012-01-31 15:59:59 $dt =  carbon::create(2012,  1,  31,  15,  32,  45);echo carbon::getmiddayat();  // 12获取正午时间 echo $dt->midday();  // 2012-01-31 12:00:00 carbon::setmiddayat(13);  //设置正午时间为13点 echo carbon::getmiddayat();  // echo $dt->midday();  // 2012-01-31 13:00:00 carbon::setmiddayat(12); $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 十年(“年代?”)的开始1990,2000,2010,2010 $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();  // 2001-01-01 00:00:00 世纪的开始?为什么不是2000-01-01 00:00:00???可能老外就是这个定义的吧…… $dt =  carbon::create(2012,  1,  31,  12,  0,  0);echo $dt->endofcentury();  // 2100-12-31 23:59:59 世纪的结束?为什么不是2099-12-31 23:59:59??? $dt =  carbon::create(2012,  1,  31,  12,  0,  0); echo $dt->startofweek();  // 2012-01-30 00:00:00var_dump($dt->dayofweek ==  carbon::monday);  // bool(true) : iso8601 week starts on monday iso8601标准每周的开始是周一,老外好像认为每周的开始是周日…… $dt =  carbon::create(2012,  1,  31,  12,  0,  0);echo $dt->endofweek();  // 2012-02-05 23:59:59var_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 (1+30)/2 = 15 int运算 echo carbon::create(2014,  5,  30,  0,  0,  0)->firstofmonth();  // 2014-05-01 00:00:00 这个月的第一天 echo carbon::create(2014,  5,  30,  0,  0,  0)->firstofmonth(carbon::monday);  // 2014-05-05 00:00:00 这个月的第一个周一echo carbon::create(2014,  5,  30,  0,  0,  0)->lastofmonth();  // 2014-05-31 00:00:00 这个月的最后一天 echo carbon::create(2014,  5,  30,  0,  0,  0)->lastofmonth(carbon::tuesday);  // 2014-05-27 00:00:00 这个月的最后一个周二 echo carbon::create(2014,  5,  30,  0,  0,  0)->nthofmonth(2,  carbon::saturday);  // 2014-05-10 00:00:00 这个月的第“2”个“周六”,2和周六是参数 echo carbon::create(2014,  5,  30,  0,  0,  0)->firstofquarter();  // 2014-04-01 00:00:00 这个季度的第一天(5月是第二个季度,所以是4月1号) echo carbon::create(2014,  5,  30,  0,  0,  0)->firstofquarter(carbon::monday);  // 2014-04-07 00:00:00 这个季度的第一个周一 echo carbon::create(2014,  5,  30,  0,  0,  0)->lastofquarter();  // 2014-06-30 00:00:00 这个季度的最后一天 echo carbon::create(2014,  5,  30,  0,  0,  0)->lastofquarter(carbon::tuesday);  // 2014-06-24 00:00:00 这个季度的最后一个周二echo carbon::create(2014,  5,  30,  0,  0,  0)->nthofquarter(2,  carbon::saturday);  // 2014-04-12 00:00:00 这个季度的第“2”个“周六”,2和周六是参数echo carbon::create(2014,  5,  30,  0,  0,  0)->startofquarter();  // 2014-04-01 00:00:00 这个季度的开始 echo carbon::create(2014,  5,  30,  0,  0,  0)->endofquarter();  // 2014-06-30 23:59:59 这个季度的结束echo carbon::create(2014,  5,  30,  0,  0,  0)->firstofyear();  // 2014-01-01 00:00:00 同上…… echo carbon::create(2014,  5,  30,  0,  0,  0)->firstofyear(carbon::monday);  // 2014-01-06 00:00:00 echo carbon::create(2014,  5,  30,  0,  0,  0)->lastofyear();  // 2014-12-31 00:00:00 echo carbon::create(2014,  5,  30,  0,  0,  0)->lastofyear(carbon::tuesday);  // 2014-12-30 00:00:00echo carbon::create(2014,  5,  30,  0,  0,  0)->nthofyear(2,  carbon::saturday);  // 2014-01-11 00:00:00 echo carbon::create(2018,  2,  23,  0,  0,  0)->nextweekday();  // 2018-02-26 00:00:00 下周一echo carbon::create(2018,  2,  23,  0,  0,  0)->previousweekday();  // 2018-02-22 00:00:00 这周的上一个工作日 echo carbon::create(2018,  2,  21,  0,  0,  0)->nextweekendday();  // 2018-02-24 00:00:00 即将要过的周末的第一天(即这星期的周六,如果今天是周六,则结果是周日) echo carbon::create(2018,  2,  21,  0,  0,  0)->previousweekendday();  // 2018-02-18 00:00:00 刚过完的周末的最后一个(即上一周的周日,如果今天是周日,则结果是周六)
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!'; }
serializationcarbon实例能被序列化的。
$dt =  carbon::create(2012,  12,  25,  20,  30,  00,  'europe/moscow');  echo serialize($dt);  // o:13:carbon\carbon:3:{s:4:date;s:26:2012-12-25 20:30:00.000000;s:13:timezone_type;i:3;s:8:timezone;s:13:europe/moscow;} // 等同于:echo $dt->serialize();  // o:13:carbon\carbon:3:{s:4:date;s:26:2012-12-25 20:30:00.000000;s:13:timezone_type;i:3;s:8:timezone;s:13:europe/moscow;}$dt =  'o:13:carbon\carbon:3:{s:4:date;s:26:2012-12-25 20:30:00.000000;s:13:timezone_type;i:3;s:8:timezone;s:13:europe/moscow;}'; echo unserialize($dt)->format('y-m-d\th:i:s.up t');  // 2012-12-25t20:30:00.000000+04:00 msk// 等同于:echo carbon::fromserialized($dt)->format('y-m-d\th:i:s.up t');  // 2012-12-25t20:30:00.000000+04:00 msk
jsoncarbon实例可以从json编码和解码(这些特性只能从php 5.4+中获得,参见下面关于php 5.3的注释)。
 $dt =  carbon::create(2012,  12,  25,  20,  30,  00,  'europe/moscow');  echo json_encode($dt); // {date:2012-12-25 20:30:00.000000,timezone_type:3,timezone:europe\/moscow} $json =  '{date:2012-12-25 20:30:00.000000,timezone_type:3,timezone:europe\/moscow}'; $dt =  carbon::__set_state(json_decode($json,  true));echo $dt->format('y-m-d\th:i:s.up t'); // 2012-12-25t20:30:00.000000+04:00 msk
您可以使用serializeusing()自定义序列化。
 $dt =  carbon::create(2012,  12,  25,  20,  30,  00,  'europe/moscow');  carbon::serializeusing(function  ($date)  {  return $date->gettimestamp();  });  echo json_encode($dt); /* 1356453000  */// call serializeusing with null to reset the serializer:carbon::serializeusing(null);
jsonserialize()方法返回中间通过“json_encode”将其转换为字符串,它还允许您使用php 5.3兼容性。
 $dt =  carbon::create(2012,  12,  25,  20,  30,  00,  'europe/moscow'); echo json_encode($dt->jsonserialize());// {date:2012-12-25 20:30:00.000000,timezone_type:3,timezone:europe\/moscow}  // this is equivalent to the first json_encode example but works with php 5.3. // and it can be used separately: var_dump($dt->jsonserialize());  // array(3) { [date]=> string(26)  2012-12-25 20:30:00.000000 [timezone_type]=> int(3)[timezone]=> string(13)  europe/moscow }
macro如果您习惯于使用laravel和对象(如响应或集合),您可能熟悉这个宏概念。carbon macro()的工作方式与laravel宏特性相同,它将方法名作为第一个参数,闭包作为第二个参数。这使得闭包操作可以作为一个具有给定名称的方法在所有carbon实例(也可以作为carbon static方法)上使用。
在php 5.4中,$this可用于闭包中引用当前实例。对于php 5.3的兼容性,我们还向闭包添加了一个“$self”属性。例子:
 carbon::macro('difffromyear',  function  ($year, $self =  null)  {// 这个块是为了在独立的carbon上与php版本< 5.4和laravel兼容if (!isset($self) && isset($this)) { $self = $this; } //兼容性块的结束。 return $self->diffforhumans(carbon::create($year,  1,  1,  0,  0,  0),  false,  false,  3); }); echo carbon::parse('2020-01-12 12:00:00')->difffromyear(2019);  // 1 year 1 week 4 days after
兼容性块允许您确保宏的完全兼容性。一个关于illuminate\support\carbon (laravel包装类)的宏将不会被定义,正如上面在php 5.3 $this中提到的,这个不会被定义。要使宏在任何地方都能工作,只需粘贴这个if语句测试如果它是定义的,而不是$self然后复制它,然后在函数体中使用$self。
不管您是否省略了一些可选参数,只要$self有这个名称,并且是最后一个参数:
 carbon::macro('difffromyear',  function  ($year, $absolute =  false, $short =  false, $parts =  1, $self =  null)  { // compatibility chunk  if  (!isset($self)  && isset($this))  {  $self = $this;  }return $self->diffforhumans(carbon::create($year,  1,  1,  0,  0,  0), $absolute, $short, $parts); });echo carbon::parse('2020-01-12 12:00:00')->difffromyear(2019);  // 1 year after echo carbon::parse('2020-01-12 12:00:00')->difffromyear(2019,  true);  // 1 year echo carbon::parse('2020-01-12 12:00:00')->difffromyear(2019,  true,  true);  // 1yr echo carbon::parse('2020-01-12 12:00:00')->difffromyear(2019,  true,  true,  5);  // 1yr 1w 4d 12h
还可以将宏分组到类中,并与mixin()一起应用
 class  beerdaycarbonmixin { public  function nextbeerday() {  return  function  ($self =  null)  { // compatibility chunk  if  (!isset($self)  && isset($this))  {  $self = $this; }return $self->modify('next wednesday'); }; } public  function previousbeerday(){ return  function  ($self =  null)  {// compatibility chunkif  (!isset($self)  && isset($this))  {$self = $this; }return $self->modify('previous wednesday'); }; } }carbon::mixin(new  beerdaycarbonmixin());$date =  carbon::parse('first saturday of december 2018'); echo $date->previousbeerday();  // 2018-11-28 00:00:00 echo $date->nextbeerday();  // 2018-12-05 00:00:00
您可以用hasmacro()检查是否可用宏(包括mixin)
  var_dump(carbon::hasmacro('previousbeerday'));  // bool(true) var_dump(carbon::hasmacro('difffromyear'));  // bool(true) var_dump(carbon::hasmacro('dontknowwhat'));  // bool(false)
你猜怎么着?在carboninterval和carbonperiod类上也可以使用所有的宏方法。
  carboninterval::macro('twice',  function  ($self =  null)  {  return $self->times(2);  });  echo carboninterval::day()->twice()->forhumans();  // 2 days  echo carboninterval::hours(2)->minutes(15)->twice()->forhumans(true);  // 4h 30m carbonperiod::macro('countweekdays',  function  ($self =  null)  {  return $self->filter('isweekday')->count(); }); echo carbonperiod::create('2017-11-01',  '2017-11-30')->countweekdays();  //echo carbonperiod::create('2017-12-01',  '2017-12-31')->countweekdays();  //
以下是社区提出的一些有用的宏:
carbon::macro('isholiday',  function  ($self =  null)  {  // compatibility chunk  if  (!isset($self)  && isset($this))  {  $self = $this;  }  return in_array($self->format('d/m'),  [ '25/12',  // christmas '01/01',  // new year// ... ]); }); var_dump(carbon::createmidnightdate(2012,  12,  25)->isholiday());  // bool(true)var_dump(carbon::createmidnightdate(2017,  6,  25)->isholiday());  // bool(false) var_dump(carbon::createmidnightdate(2021,  1,  1)->isholiday());  // bool(true)
检查cmixin/业务日以获得更完整的业务日处理程序。
class  currentdayscarbonmixin  { /**  * get the all dates of week.  *  * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) array  */  public  static  function getcurrentweekdays()  { return  function  ($self =  null)  {// compatibility chunkif  (!isset($self)  && isset($this))  { $self = $this;} $startofweek =  ($self ?:  static::now())->startofweek()->subday(); $weekdays = array(); for  ($i =  0; $i < static::days_per_week; $i++) { $weekdays[] = $startofweek->addday()->startofday()->copy(); } return $weekdays; }; }/** * get the all dates of month * */public  static  function getcurrentmonthdays() {return  function  ($self =  null)  {// compatibility chunkif  (!isset($self)  && isset($this))  { $self = $this; }$startofmonth =  ($self ?:  static::now())->startofmonth()->subday();$endofmonth =  ($self ?:  static::now())->endofmonth()->format('d'); $monthdays = array(); for  ($i =  0; $i < $endofmonth; $i++) { $monthdays[] = $startofmonth->addday()->startofday()->copy(); } return $monthdays; }; } } carbon::mixin(new  currentdayscarbonmixin()); function dumpdatelist($dates)  {echo substr(implode(', ', $dates),  0,  100).'...'; }dumpdatelist(carbon::getcurrentweekdays());  // 2018-07-02 00:00:00, 2018-07-03 00:00:00, 2018-07-04 00:00:00, 2018-07-05 00:00:00, 2018-07-06 00:00... dumpdatelist(carbon::getcurrentmonthdays());  // 2018-07-01 00:00:00, 2018-07-02 00:00:00, 2018-07-03 00:00:00, 2018-07-04 00:00:00, 2018-07-05 00:00... dumpdatelist(carbon::now()->submonth()->getcurrentweekdays());  // 2018-06-04 00:00:00, 2018-06-05 00:00:00, 2018-06-06 00:00:00, 2018-06-07 00:00:00, 2018-06-08 00:00... dumpdatelist(carbon::now()->submonth()->getcurrentmonthdays());  // 2018-06-01 00:00:00, 2018-06-02 00:00:00, 2018-06-03 00:00:00, 2018-06-04 00:00:00, 2018-06-05 00:00...  carbon::macro('toatomstringwithnotimezone',  function  ($self =  null)  { // compatibility chunk if  (!isset($self)  && isset($this))  {  $self = $this;  }  return $self->format('y-m-d\th:i:s');  });  echo carbon::parse('2021-06-16 20:08:34')->toatomstringwithnotimezone();  // 2021-06-16t20:08:34  *credit: afrojuju1 (#1063).*  carbon::macro('easterdate',  function  ($year)  { return  carbon::createmidnightdate($year,  3,  21)->adddays(easter_days($year));  });  echo carbon::easterdate(2015)->format('d/m');  // 05/04  echo carbon::easterdate(2016)->format('d/m');  // 27/03  echo carbon::easterdate(2017)->format('d/m');  // 16/04  echo carbon::easterdate(2018)->format('d/m');  // 01/04  echo carbon::easterdate(2019)->format('d/m');  // 21/04
查看cmixin/工作日以获得更完整的假日处理程序。
 carbon::macro('range',  function  ($startdate, $enddate)  {  return  new  dateperiod($startdate,  new  dateinterval('p1d'), $enddate);  }); foreach  (carbon::range(carbon::createmidnightdate(2019,  3,  28),  carbon::createmidnightdate(2019,  4,  3))  as $date)  { echo $date\n;  } /*  2019-03-28 00:00:00  2019-03-29 00:00:002019-03-30 00:00:00 2019-03-31 00:00:00. 2019-04-01 00:00:002019-04-02 00:00:00 */  class  usertimezonecarbonmixin  {  public $usertimezone; /** * set user timezone, will be used before format function to apply current user timezone  *  * @param $timezone */ public  function setusertimezone() { $mixin = $this; return  function  ($timezone)  use  ($mixin)  {$mixin->usertimezone = $timezone; }; } /** * returns date formatted according to given format. * * @param string $format. * * * @link http://php.net/manual/en/datetime.format.php */public  function tzformat() { $mixin = $this;return  function  ($format, $self =  null)  use  ($mixin)  { // compatibility chunk if  (!isset($self)  && isset($this))  { $self = $this; }if  (!is_null($mixin->usertimezone))  { $self->timezone($mixin->usertimezone); } return $self->format($format); }; } }carbon::mixin(new  usertimezonecarbonmixin()); carbon::setusertimezone('europe/berlin'); echo carbon::createfromtime(12,  0,  0,  'utc')->tzformat('h:i');  // 14:00echo carbon::createfromtime(15,  0,  0,  'utc')->tzformat('h:i');  // 17:00 carbon::setusertimezone('america/toronto'); echo carbon::createfromtime(12,  0,  0,  'utc')->tzformat('h:i');  // 08:00 echo carbon::createfromtime(15,  0,  0,  'utc')->tzformat('h:i');  // 11:00
carbonintervalcarboninterval类继承了php dateinterval类。
 <?php class carboninterval extends \dateinterval { // code here }
你可以通过以下方式创建实例
echo carboninterval::year(); // 1 year echo carboninterval::months(3); // 3 monthsecho 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()函数创建一个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
其他的帮助程序,但是要注意实现提供了帮助程序来处理几周,但是只节省了几天。数周是根据当前实例的总天数计算的。
echo carboninterval::year()->years;  //  echo carboninterval::year()->dayz;  //  echo carboninterval::days(24)->dayz;  //  echo carboninterval::days(24)->daysexcludeweeks;  //  echo carboninterval::weeks(3)->days(14)->weeks;  // 2  <-- days setter overwrites the current value echo carboninterval::weeks(3)->weeks;  //  echo carboninterval::minutes(3)->weeksanddays(2,  5);  // 2 weeks 5 days 3 minutescarboninterval扩展dateinterval,您可以使用iso-8601的持续时间格式创建这两种格式:  $ci =  carboninterval::create('p1y2m3d');  $ci =  new  carboninterval('pt0s');
借助fromstring()方法,可以从友好的字符串创建carbon intervals。
carboninterval::fromstring('2 minutes 15 seconds'); carboninterval::fromstring('2m 15s');  // or abbreviated
注意这个月缩写为“mo”以区别于分钟和整个语法不区分大小写。
它还有一个方便的for human(),它被映射为__tostring()实现,用于为人类打印间隔。
  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’)更改字符串的语言环境。
至于carbon,您可以使用make方法从其他区间或字符串返回一个新的carboninterval实例:
 $dateinterval =  new  dateinterval('p2d');$carboninterval =  carboninterval::month(); echo carboninterval::make($dateinterval)->forhumans();  // 2 days  echo carboninterval::make($carboninterval)->forhumans();  // 1 month  echo carboninterval::make('pt3h')->forhumans();  // 3 hours echo carboninterval::make('1h 15m')->forhumans();  // 1 hour 15 minutes// pass true to get short format  echo carboninterval::make('1h 15m')->forhumans(true);  // 1h 15m
本机dateinterval分别添加和相乘,因此:
  $interval =  carboninterval::make('7h 55m'); $interval->add(carboninterval::make('17h 35m'));  $interval->times(3); echo $interval->forhumans();  // 72 hours 270 minutes
从单位到单位的输入中得到纯计算。将分钟级联成小时、小时级联成天等。使用级联方法:
 echo $interval->forhumans();  // 72 hours 270 minutes  echo $interval->cascade()->forhumans();  // 3 days 4 hours 30 minutes
默认的因素有:
1分钟= 60秒
1小时=60分钟
1天=24小时
1周= 7天
1个月= 4周
1年= 12个月
carbonintervals 没有上下文,所以它们不能更精确(没有dst、没有闰年、没有实际的月长或年长)。但是你可以完全定制这些因素。例如处理工作时间日志:
  $cascades =  carboninterval::getcascadefactors();  // save initial factors  carboninterval::setcascadefactors(array( 'minute'  => array(60,  'seconds') 'hour'  => array(60,  'minutes'),  'day'  => array(8,  'hours'),  'week'  => array(5,  'days'),  // in this example the cascade won't go farther than week unit  )); echo carboninterval::fromstring('20h')->cascade()->forhumans();  // 2 days 4 hours echo carboninterval::fromstring('10d')->cascade()->forhumans();  // 2 weeks echo carboninterval::fromstring('3w 18d 53h 159m')->cascade()->forhumans();  // 7 weeks 4 days 7 hours 39 minutes // you can see currently set factors with getfactor: echo carboninterval::getfactor('minutes',  /* per */  'hour');  // echo carboninterval::getfactor('days',  'week');  // 5 // and common factors can be get with short-cut methods: echo carboninterval::getdaysperweek();  //echo carboninterval::gethoursperday();  // echo carboninterval::getminutesperhours();  //echo carboninterval::getsecondsperminutes();  // carboninterval::setcascadefactors($cascades);  // restore original factors
是否可能将间隔转换为给定的单元(使用提供的级联因子)。
  echo carboninterval::days(3)->hours(5)->total('hours');  // echo carboninterval::days(3)->hours(5)->totalhours;  //  echo carboninterval::months(6)->totalweeks;  //echo carboninterval::year()->totaldays;  //
您还可以使用spec()获得inverval的iso 8601规范
  echo carboninterval::days(3)->hours(5)->spec();  // p3dt5h
也可以从dateinterval对象获取它,因为它是静态助手:
  echo carboninterval::getdateintervalspec(new  dateinterval('p3dt6m10s'));  // p3dt6m10s
使用compare()和comparedateinterval()方法可以对日期间隔列表进行排序:
$halfday =  carboninterval::hours(12);  $oneday =  carboninterval::day();  $twoday =  carboninterval::days(2);  echo carboninterval::comparedateintervals($oneday, $oneday);  //  echo $oneday->compare($oneday);  // echo carboninterval::comparedateintervals($oneday, $halfday);  //  echo $oneday->compare($halfday);  // echo carboninterval::comparedateintervals($oneday, $twoday);  // -1 echo $oneday->compare($twoday);  // -1 $list = array($twoday, $halfday, $oneday);usort($list, array('carbon\carboninterval',  'comparedateintervals')); echo implode(', ', $list);  // 12 hours, 1 day, 2 days
最后,通过使用互补参数调用toperiod(),可以将一个carboninterval实例转换为一个carbonperiod实例。
我听到你问什么是carbonperiod 实例。哦!完美过渡到下一章。
carbonperiodcarbonperiod是一个友好的dateperiod版本,具有许多快捷方式。
  // create a new instance:  $period =  new  carbonperiod('2018-04-21',  '3 days',  '2018-04-27'); // use static constructor: $period =  carbonperiod::create('2018-04-21',  '3 days',  '2018-04-27');  // use the fluent setters:  $period =  carbonperiod::since('2018-04-21')->days(3)->until('2018-04-27');  // start from a carboninterval: $period =  carboninterval::days(3)->toperiod('2018-04-21',  '2018-04-27');
carbonperiod可以通过多种方式构建:
开始日期、结束日期和可选间隔(默认为1天),
起始日期,递归次数和可选区间,
iso 8601间隔规范。
日期可以是datetime/carbon实例,绝对字符串如“2007-10-15 15:00”或相对字符串,例如“next monday”。interval可以作为dateinterval/carboninterval实例、iso 8601的interval规范(如“p4d”)或人类可读字符串(如“4 days”)给出。
默认构造函数和create()方法在参数类型和顺序方面都很容易理解,所以如果您想要更精确,建议使用fluent语法。另一方面,您可以将动态值数组传递给createfromarray(),它将使用给定的数组作为参数列表构造一个新实例。
carbonperiod实现迭代器接口。它意味着它可以直接传递给foreach循环:
 $period =  carbonperiod::create('2018-04-21',  '3 days',  '2018-04-27');  foreach  ($period as $key => $date)  { if  ($key)  {  echo ', '; }  echo $date->format('m-d'); }// 04-21, 04-24, 04-27// here is what happens under the hood:$period->rewind();  // restart the iteration while  ($period->valid())  {  // check if current item is valid if  ($period->key())  {  // echo comma if current key is greater than 0 echo ', '; }echo $period->current()->format('m-d');  // echo current date$period->next();  // move to the next item }// 04-21, 04-24, 04-27
参数可以在迭代过程中进行修改:
 $period =  carbonperiod::create('2018-04-29',  7);  $dates = array();  foreach  ($period as $key => $date)  {  if  ($key ===  3)  { $period->invert()->start($date);  // invert() is an alias for invertdateinterval() }  $dates[]  = $date->format('m-d'); } echo implode(', ', $dates);  // 04-29, 04-30, 05-01, 05-02, 05-01, 04-30, 04-29
和dateperiod一样,carbonperiod也支持iso 8601时间间隔规范。
请注意,本机日期周期将递归处理为多次重复间隔。因此,在排除开始日期时,它将减少一个结果。carbonperiod的自定义过滤器的引入使得知道结果的数量变得更加困难。由于这个原因,我们稍微改变了实现,递归被视为返回日期的总体限制。
  // possible options are: carbonperiod::exclude_start_date | carbonperiod::exclude_end_date  // default value is 0 which will have the same effect as when no options are given.  $period =  carbonperiod::createfromiso('r4/2012-07-01t00:00:00z/p7d',  carbonperiod::exclude_start_date);  $dates = array(); foreach  ($period as $date)  {  $dates[]  = $date->format('m-d');  } echo implode(', ', $dates);  // 07-08, 07-15, 07-22, 07-29
您可以从不同的getter中检索数据:
 $period =  carbonperiod::create('2010-05-06',  '2010-05-25',  carbonperiod::exclude_start_date);  $exclude = $period->getoptions()  &  carbonperiod::exclude_start_date; echo $period->getstartdate();  // 2010-05-06 00:00:00  echo $period->getenddate();  // 2010-05-25 00:00:00 echo $period->getdateinterval();  // 1 dayecho $exclude ?  'exclude'  :  'include';  // exclude var_dump($period->isstartexcluded());  // bool(true)var_dump($period->isendexcluded());  // bool(false)echo $period->tostring();  // every 1 day from 2010-05-06 to 2010-05-25 echo $period;  /*implicit tostring*/  // every 1 day from 2010-05-06 to 2010-05-25
附加的getter允许您以数组的形式访问结果:
  $period =  carbonperiod::create('2010-05-11',  '2010-05-13'); echo $period->count();  // 3, equivalent to count($period)echo implode(', ', $period->toarray());  // 2010-05-11 00:00:00, 2010-05-12 00:00:00, 2010-05-13 00:00:00  echo $period->first();  // 2010-05-11 00:00:00 echo $period->last();  // 2010-05-13 00:00:00
注意,如果您打算使用上述函数,将toarray()调用的结果存储为变量并使用它是一个好主意,因为每个调用在内部执行一个完整的迭代。
想要更改参数,可以使用setter方法:
  $period =  carbonperiod::create('2010-05-01',  '2010-05-14',  carbonperiod::exclude_end_date);  $period->setstartdate('2010-05-11'); echo implode(', ', $period->toarray());  // 2010-05-11 00:00:00, 2010-05-12 00:00:00, 2010-05-13 00:00:00 // second argument can be optionally used to exclude the date from the results. $period->setstartdate('2010-05-11',  false); $period->setenddate('2010-05-14',  true); echo implode(', ', $period->toarray());  // 2010-05-12 00:00:00, 2010-05-13 00:00:00, 2010-05-14 00:00:00 $period->setrecurrences(2); echo implode(', ', $period->toarray());  // 2010-05-12 00:00:00, 2010-05-13 00:00:00 $period->setdateinterval('pt12h'); echo implode(', ', $period->toarray());  // 2010-05-11 12:00:00, 2010-05-12 00:00:00
您可以使用setoptions()更改选项以替换所有选项,但也可以分别更改:
  $period =  carbonperiod::create('2010-05-06',  '2010-05-25');var_dump($period->isstartexcluded());  // bool(false) var_dump($period->isendexcluded());  // bool(false) $period->toggleoptions(carbonperiod::exclude_start_date,  true);  // true, false or nothing to invert the option  var_dump($period->isstartexcluded());  // bool(true) var_dump($period->isendexcluded());  // bool(false) (unchanged) $period->excludeenddate();  // specify false to include, true or omit to excludevar_dump($period->isstartexcluded());  // bool(true) (unchanged)var_dump($period->isendexcluded());  // bool(true) $period->excludestartdate(false);  // specify false to include, true or omit to excludevar_dump($period->isstartexcluded());  // bool(false)var_dump($period->isendexcluded());  // bool(true)
如前所述,根据iso 8601规范,递归是重复间隔的数倍。因此,本机dateperiod将根据开始日期的排除而改变返回日期的数量。与此同时,carbonperiod在输入和允许自定义过滤器方面更加宽容,将递归作为返回日期的总体限制:
 $period =  carbonperiod::createfromiso('r4/2012-07-01t00:00:00z/p7d');  $days = array();  foreach  ($period as $date)  { $days[]  = $date->format('d'); } echo $period->getrecurrences();  // echo implode(', ', $days);  // 01, 08, 15, 22$days = array();$period->setrecurrences(3)->excludestartdate();foreach  ($period as $date)  { $days[]  = $date->format('d');} echo $period->getrecurrences();  // echo implode(', ', $days);  // 08, 15, 22 $days = array(); $period =  carbonperiod::recurrences(3)->sincenow();foreach  ($period as $date)  {$days[]  = $date->format('y-m-d');} echo implode(', ', $days);  // 2018-07-05, 2018-07-06, 2018-07-07
dateperiod返回的日期可以很容易地过滤。例如,过滤器可以用于跳过某些日期或只在工作日或周末迭代。筛选函数应该返回true以接受日期,返回false以跳过日期,但继续搜索或carbonperiod::end_iteration以结束迭代。
 $period =  carbonperiod::between('2000-01-01',  '2000-01-15'); $weekendfilter =  function  ($date)  { return $date->isweekend(); };  $period->filter($weekendfilter);  $days = array();foreach  ($period as $date)  { $days[]  = $date->format('m-d');} echo implode(', ', $days);  // 01-01, 01-02, 01-08, 01-09, 01-15
您还可以跳过循环中的一个或多个值。
  $period =  carbonperiod::between('2000-01-01',  '2000-01-10');  $days = array(); foreach  ($period as $date)  { $day = $date->format('m-d');  $days[]  = $day; if  ($day ===  '01-04')  { $period->skip(3); } }echo implode(', ', $days);  // 01-01, 01-02, 01-03, 01-04, 01-08, 01-09, 01-10
getfilters()允许您在一个时间段内检索所有存储的过滤器。但是要注意递归限制和结束日期将出现在返回的数组中,因为它们作为过滤器存储在内部。
  $period =  carbonperiod::end('2000-01-01')->recurrences(3);var_export($period->getfilters());  /*  array (  0 =>  array (  0 => 'carbon\\carbonperiod::filterenddate',  1 => null,  ), 1 => array ( 0 => 'carbon\\carbonperiod::filterrecurrences',1 => null, ), ) */
过滤器存储在堆栈中,可以使用一组特殊的方法进行管理:
 $period =  carbonperiod::between('2000-01-01',  '2000-01-15');  $weekendfilter =  function  ($date)  {  return $date->isweekend(); };  var_dump($period->hasfilter($weekendfilter));  // bool(false) $period->addfilter($weekendfilter);  var_dump($period->hasfilter($weekendfilter));  // bool(true)  $period->removefilter($weekendfilter);var_dump($period->hasfilter($weekendfilter));  // bool(false) // to avoid storing filters as variables you can name your filters:$period->prependfilter(function  ($date)  { return $date->isweekend();},  'weekend');var_dump($period->hasfilter('weekend'));  // bool(true) $period->removefilter('weekend'); var_dump($period->hasfilter('weekend'));  // bool(false)
添加过滤器的顺序会对性能和结果产生影响,因此您可以使用addfilter()在堆栈末尾添加过滤器;您可以使用prependfilter()在开始时添加一个。甚至可以使用setfilter()替换所有的过滤器。请注意,您必须保持堆栈的正确格式,并记住关于递归限制和结束日期的内部过滤器。或者,您可以使用resetfilters()方法,然后逐个添加新的过滤器。
例如,当您添加一个限制尝试日期数量的自定义过滤器时,如果您在工作日过滤器之前或之后添加它,那么结果将是不同的。
// note that you can pass a name of any carbon method starting with is, including macros  $period =  carbonperiod::between('2018-05-03',  '2018-05-25')->filter('isweekday');  $attempts =  0;$attemptsfilter =  function  ()  use  (&$attempts)  { return  ++$attempts <= 5 ? true : carbonperiod::end_iteration; }; $period->prependfilter($attemptsfilter,  'attempts'); $days = array(); foreach  ($period as $date)  {$days[]  = $date->format('m-d'); } echo implode(', ', $days);  // 05-03, 05-04, 05-07 $attempts =  0; $period->removefilter($attemptsfilter)->addfilter($attemptsfilter,  'attempts');$days = array(); foreach  ($period as $date)  { $days[]  = $date->format('m-d'); } echo implode(', ', $days);  // 05-03, 05-04, 05-07, 05-08, 05-09
注意,内置的递归过滤器不是这样工作的。相反,它基于当前键,每个条目只增加一次,无论在找到有效日期之前需要检查多少个日期。如果您将它放在堆栈的开头或末尾,那么这个技巧将使它的工作方式相同。
为了简化carbonperiod的构建,添加了一些别名:
  // start, since, sincenow:  carbonperiod::start('2017-03-10')  ==  carbonperiod::create()->setstartdate('2017-03-10');  // same with optional boolean argument $inclusive to change the option about include/exclude start date: carbonperiod::start('2017-03-10',  true)  ==  carbonperiod::create()->setstartdate('2017-03-10',  true);  // end, until, untilnow:  carbonperiod::end('2017-03-20')  ==  carbonperiod::create()->setenddate('2017-03-20');  // same with optional boolean argument $inclusive to change the option about include/exclude end date: carbonperiod::end('2017-03-20',  true)  ==  carbonperiod::create()->setenddate('2017-03-20',  true); // dates, between: carbonperiod::dates(...,  ...)  ==  carbonperiod::create()->setdates(...,  ...);// recurrences, times:carbonperiod::recurrences(5)  ==  carbonperiod::create()->setrecurrences(5); // options:carbonperiod::options(...)  ==  carbonperiod::create()->setoptions(...);// toggle:carbonperiod::toggle(...,  true)  ==  carbonperiod::create()->toggleoptions(...,  true);// filter, push:carbonperiod::filter(...)  ==  carbonperiod::create()->addfilter(...);// prepend: carbonperiod::prepend(...)  ==  carbonperiod::create()->prependfilter(...); // filters:carbonperiod::filters(...)  ==  carbonperiod::create()->setfilters(...); // interval, each, every, step, stepby:carbonperiod::interval(...)  ==  carbonperiod::create()->setdateinterval(...);// invert: carbonperiod::invert()  ==  carbonperiod::create()->invertdateinterval();// year, months, month, weeks, week, days, dayz, day,// hours, hour, minutes, minute, seconds, second: carbonperiod::hours(5)  ==  carbonperiod::create()->setdateinterval(new  carboninterval::hours(5));
可以很容易地将carbonperiod转换为人类可读的字符串和iso 8601规范:
  $period =  carbonperiod::create('2000-01-01 12:00',  '3 days 12 hours',  '2000-01-15 12:00');  echo $period->tostring();  // every 3 days 12 hours from 2000-01-01 12:00:00 to 2000-01-15 12:00:00  echo $period->toiso8601string();  // 2000-01-01t12:00:00-05:00/p3dt12h/2000-01-15t12:00:00-05:00
以上就是聊聊laravel carbon扩展包的作用及用法的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product