您好,欢迎访问一九零五行业门户网

详细介绍PHP中时间处理类Carbon的用法

本篇文章主要给大家介绍了关于php的相关知识,carbon 是php的日期处理类库(a simple php api extension for datetime.),继承了php的 datetime 类,下面讲解一下该类的使用,希望对大家有帮助。
(推荐教程:php视频教程)
1.introductioncarbon 是php的日期处理类库(a simple php api extension for datetime.)。
carbon 继承了php的 datetime 类,所以 carbon 中没有涉及到的,但在 datetime 中已经实现的方法都是可以使用的。
看代码
<?phpnamespace carbon; class carbon extends \datetime{ // code here}
carbon 类声明在 carbon 命名空间下,可以通过引入命名空间的方式来代替每次输入完整的类名。
<?phpuse carbon\carbon;
note:如果在使用 carbon 时,没有专门设置时区的话,默认使用 america/toronto 的时区。
要特别留意是否使用了正确的时区,比如 carbon 的所有差异比较都使用 utc 或者系统设定的时区。
<?php$dttoronto = carbon::createfromdate(2012, 1, 1, 'america/toronto');$dtvancouver = carbon::createfromdate(2012, 1, 1, 'america/vancouver'); echo $dtvancouver->diffinhours($dttoronto); // 3
以上进行的时间比较是在提供的 carbon 实例所在的时区下完成的。例如作者所在的时区为 东京时间减13 小时,因此在下午一点后。carbon::now(‘asia/tokyo’)->istoday() 将会返回 false ,如果在调用 now() 时设置时区为东京时区,接下来的操作都使用东京时区是说不过去的。所以在与 now() 创建的实例进行比较时,默认是在当前时区下完成的。
2.instantiation有好几种方式可以创建 carbon 的实例,但是大家应该更倾向于通过这种语义化的静态方法来实现。
<?php$carbon = new carbon(); // equivalent to carbon::now()$carbon = new carbon('first day of january 2008', 'america/vancouver');echo get_class($carbon); // 'carbon\carbon'$carbon = carbon::now(-5);
值得注意的是,carbon 构造器的第二个参数被增强到了不仅限于\datetimezone 实例,还可以是 string、integer (表示相对于gmt的偏移值)。举个例子来说明下 now() 方法。
<?php$now = carbon::now(); $nowinlondontz = carbon::now(new datetimezone('europe/london')); // or just pass the timezone as a string$nowinlondontz = carbon::now('europe/london'); // or to create a date with a timezone of +1 to gmt during dst then just pass an integerecho carbon::now(1)->tzname; // europe/london
你将会喜欢上用 parse() 方法来代替原有繁琐的构造方式
<?phpecho (new carbon('first day of december 2008'))->addweeks(2); // 2008-12-15 00:00:00echo carbon::parse('first day of december 2008')->addweeks(2); // 2008-12-15 00:00:00
类似 now() 这样直接返回 carbon 实例的方法还有 today(), tomorrow(),yesterday(),他们都接受一个 timezone 类型的参数,最后得到的结果时间部分都是 00:00:00
<?php$now = carbon::now();echo $now; // 2016-06-24 15:18:34$today = carbon::today();echo $today; // 2016-06-24 00:00:00$tomorrow = carbon::tomorrow('europe/london');echo $tomorrow; // 2016-06-25 00:00:00$yesterday = carbon::yesterday();echo $yesterday; // 2016-06-23 00:00:00
下面是一些其他的 creatxxx() 形式的静态方法。绝大多数静态方法的参数是可传可不传的,如果不传的话会使用方法预设的默认值,这些预设值一般都是针对当前日期、时间、时区的。如果为传递某个必要参数,会抛出一个 invalidargumentexception 类型的异常,用 datetime::getlasterrors() 方法可以得到异常的详细信息。
<?phpcarbon::createfromdate($year, $month, $day, $tz);carbon::createfromtime($hour, $minute, $second, $tz);carbon::create($year, $month, $day, $hour, $minute, $second, $tz);
createfromdate() 默认返回当前时间,createfromtime()日期默认是今天。crete() 所有为 null 的参数都将默认为当前对应的时间。同样,时区也默认是当前时区。如果只设置了小时数没有设置分秒那么分秒默认是 0
<?php$xmasthisyear = carbon::createfromdate(null, 12, 25); // year defaults to current year$y2k = carbon::create(2000, 1, 1, 0, 0, 0);$alsoy2k = carbon::create(1999, 12, 31, 24);$noonlondontz = carbon::createfromtime(12, 0, 0, 'europe/london'); // a two digit minute could not be foundtry { carbon::create(1975, 5, 21, 22, -2, 0); } catch(invalidargumentexception $x) { echo $x->getmessage(); }
<?phpcarbon::createfromformat($format, $time, $tz);
createfromformat() 与php的datetime::createfromformat。不同之处是 $dt 参数可以是 datetimezone 的实例或者一个时区的字符串。并且可以会返回参数异常的提示。从createxx()的源码可以看出,他们都调用了createfromformat()方法。
<?phpecho carbon::createfromformat('y-m-d h', '1975-05-21 22')->todatetimestring(); // 1975-05-21 22:00:00
最后提到的这两个create方法都是处理unix时间戳的。第一个将会返回一个等于预期时间戳的 carbon 实例,时区可以设置也可以选用默认值。第二个方法,createfromtimestamputc() 与第一个不同的是时区将始终是 utc(gmt) .第一个方法的第二个示例,只是为了让这个函数的用法展现的更加明确。negative timestamps are also allowed.
<?phpecho carbon::createfromtimestamp(-1)->todatetimestring(); // 1969-12-31 18:59:59echo carbon::createfromtimestamp(-1, 'europe/london')->todatetimestring(); // 1970-01-01 00:59:59echo carbon::createfromtimestamputc(-1)->todatetimestring(); // 1969-12-31 23:59:59
copy() 方法可以copy一个已经存在的 carbon 实例。对copy生成实例进行修改并不会影响被copy对象的本身。
<?php$dt = carbon::now();echo $dt->diffinyears($dt->copy()->addyear()); // 1 // $dt was unchanged and still holds the value of carbon:now()
最后,当你正在使用的 datetime 实例是通过实例化其他继承了 \datetime 库而得到的,别怕!通过下边的方式仍然可以极其友好创建 carbon 实例。
<?php$dt = new \datetime('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 类也可以设置毫秒,但是在进行日期的数学预算时并不会考虑毫秒。从 carbon 1.12.0版本起,实例化、copy也能像 format() 方法一样支持毫秒(php默认的只有 datetime::format() 支持毫秒)。
<?php$dt = carbon::parse('1975-05-21 22:23:00.123456');echo $dt->micro; // 123456echo $dt->copy()->micro; // 123456
获取php支持的有效时间取值范围:最早时间、最晚时间
<?phpecho carbon::maxvalue(); // '2038-01-18 22:14:07'echo carbon::minvalue(); // '1901-12-13 15:45:52'
3.localizationcarbon中,formatlocalized() 方法通过调用 strftime() 方法,弥补了php底层的 datetime 类不支持区域化设置的缺陷。如果你已经通过使用setlocale() 方法设置过当前区域,formatlocalized($format) 方法将会按照设置的区域格式进行返回。
<?phpsetlocale(lc_time, 'german');echo $dt->formatlocalized('%a %d %b %y'); // mittwoch 21 mai 1975setlocale(lc_time, '');echo $dt->formatlocalized('%a %d %b %y'); // wednesday 21 may 1975
diffforhumans() 的结果也会被转化成区域语言。通过carbon::setlocale() 方法可以设置 carbon 的区域语言。
<?phpcarbon::setlocale('de');echo carbon::now()->addyear()->diffforhumans(); // in 1 jahr carbon::setlocale('en');
注意:如果在linux系统中转换出现了问题,请仔细检查安装在本地或生产系统中语言环境
locale -a 列举出所有可用的语言环境
sudo locale-gen zh_cn.utf8 安装新的语言环境
sudo dpkg-reconfigure locales 配置启用新的语言环境,并重启
4.testing aids()通过测试方法可以得到一个模拟或真实的 carbon 实例。只有在以下情况下,主动提供的 carbon 实例才会被特殊处理:
调用静态方法 now(),例如:carbon::now()传给 construct 或 parse() 方法的是 null (或空字符串),例如:new carbon(null)当传给 construct 或 parse()的是字符串 now,例如:new carbon(‘now’)$knowndate = carbon::create(2001, 5, 21, 12); // create testing datecarbon::settestnow($knowndate); // set the mock (of course this could be a real mock object)echo carbon::now(); // 2001-05-21 12:00:00echo new carbon(); // 2001-05-21 12:00:00echo carbon::parse(); // 2001-05-21 12:00:00echo new carbon('now'); // 2001-05-21 12:00:00echo carbon::parse('now'); // 2001-05-21 12:00:00var_dump(carbon::hastestnow()); // bool(true)carbon::settestnow(); // clear the mockvar_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(); // 100carbon::settestnow(carbon::parse('first day of december 2000'));echo $product->getprice(); // 200carbon::settestnow(carbon::parse('first day of may 2000'));echo $product->getprice(); // 100carbon::settestnow();
一些相关的用法也可以得到一个模拟的 now 实例,返回相应的模拟数据。
$knowndate = carbon::create(2001, 5, 21, 12); // create testing datecarbon::settestnow($knowndate); // set the mockecho new carbon('tomorrow'); // 2001-05-22 00:00:00 ... notice the time !echo new carbon('yesterday'); // 2001-05-20 00:00:00echo new carbon('next wednesday'); // 2001-05-23 00:00:00echo new carbon('last friday'); // 2001-05-18 00:00:00echo new carbon('this thursday'); // 2001-05-24 00:00:00carbon::settestnow();
以下是当前支持的时间转换字
thislastnexttomorrowyesterday+-firstago值得注意的是像 next() , previous() 和 modify() 方法等相关的修改会把日期的时间部分设置成 00:00:00 。
5.getters获取器通过php的 __get() 方式实现。可以直接通过一下方式直接获取到属性的值。
$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 tzvar_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 onvar_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 timezonevar_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); // datetimezoneecho get_class(carbon::now()->tz); // datetimezone // gets the datetimezone instance name, shortcut for ->timezone->getname()echo carbon::now()->timezonename; // america/torontoecho carbon::now()->tzname; // america/toronto
6.setterssetters 通过php的 __set() 方法实现。值得注意的是,通过这种方式设置时间戳时,时区不会相对于时间戳而改变。如果需要改变时区的话,需要针对时区单独设置。
$dt = carbon::now(); $dt->year = 1975;$dt->month = 13; // would force year++ and month = 1$dt->month = 5;$dt->day = 21;$dt->hour = 22;$dt->minute = 32;$dt->second = 5; $dt->timestamp = 169957925; // this will not change the timezone // set the timezone via datetimezone instance or string$dt->timezone = new datetimezone('europe/london');$dt->timezone = 'europe/london';$dt->tz = 'europe/london';
7.fluent setters此处 setters 方法的参数是必选参数,carbon 提供了更多种设置方式可供使用。值得注意的是,所有对于时区的修改都会影响整个到 carbon 实例。对时间戳进行修改时不会自动转换到时间戳对应的时区。
$dt = carbon::now(); $dt->year(1975)->month(5)->day(21)->hour(22)->minute(32)->second(5)->todatetimestring();$dt->setdate(1975, 5, 21)->settime(22, 32, 5)->todatetimestring();$dt->setdatetime(1975, 5, 21, 22, 32, 5)->todatetimestring(); $dt->timestamp(169957925)->timezone('europe/london'); $dt->tz('america/toronto')->settimezone('america/vancouver');
8.isset当尝试调用 carbon 实例的属性时,会首先检查该属性是否存在,存在返回 true,不存在返回 false。
var_dump(isset(carbon::now()->idonotexist)); // bool(false)var_dump(isset(carbon::now()->hour)); // bool(true)var_dump(empty(carbon::now()->idonotexist)); // bool(true)var_dump(empty(carbon::now()->year)); // bool(false)
(推荐教程:php视频教程)
以上就是详细介绍php中时间处理类carbon的用法的详细内容。
其它类似信息

推荐信息