## # 日期和时间处理组件-Carbon : nesbot/carbon
### 参考地址
- https://www.cnblogs.com/qinsilandiao/p/10871551.html
- 手册 https://carbon.nesbot.com/docs/
# Carbon介绍
[Carbon](https://carbon.nesbot.com/)是php的日期处理类库
Carbon 继承了PHP的[Datetime](http://php.net/manual/zh/class.datetime.php)类,所以 Carbon 中没有涉及到的,但在[Datetime](http://php.net/manual/zh/class.datetime.php)中已经实现的方法都是可以使用的。
> Laravel 中的**Carbon**就是这货。
## 选择适合的Carbon版本:
目前 Carbon 1.x 仅版本适用于php 5.3以上的版本
Carbon 2.x 也可以使用了,但是要求php 5.4以上的版本
选择合适的安装方式:
composer安装(最简单并且推荐的方法):
命令行安装
~~~
$ composer require nesbot/carbon
~~~
编辑composer.json文件:
~~~
{
"require": {
"nesbot/carbon": "*"
}
}
~~~
[直接下载](https://github.com/briannesbitt/Carbon/blob/master/src/Carbon/Carbon.php)Carbon.php安装到项目中:
~~~php
<?php
require 'path/to/Carbon.php';
use Carbon\Carbon;
printf("Now: %s", Carbon::now());
~~~
# Carbon实例
Carbon 类声明在 Carbon 命名空间下,可以通过引入命名空间的方式来代替每次输入完整的类名。
~~~php
<?php
use Carbon\Carbon;
~~~
**Note:**如果在使用 Carbon 时,没有专门设置时区的话,默认使用 America/Toronto 的时区。
要特别留意是否使用了正确的时区,比如 Carbon 的所有差异比较都使用 UTC 或者系统设定的时区。
~~~php
<?php
$dtToronto = Carbon::createFromDate(2019, 1, 1, 'America/Toronto');
$dtVancouver = Carbon::createFromDate(2019, 1, 1, 'America/Vancouver');
echo $dtVancouver->diffInHours($dtToronto); // 3
~~~
以上进行的时间比较是在提供的 Carbon 实例所在的时区下完成的。例如作者所在的时区为 东京时间减13 小时,因此在下午一点后。Carbon::now(‘Asia/Tokyo’)->isToday() 将会返回 false ,如果在调用 now() 时设置时区为东京时区,接下来的操作都使用东京时区是说不过去的。所以在与 now() 创建的实例进行比较时,默认是在当前时区下完成的。
值得注意的是,Carbon 构造器的第二个参数被增强到了不仅限于是[\\DateTimeZone](http://php.net/manual/en/class.datetimezone.php)实例,还可以是 String、Integer。举个栗子来说明下 now() 方法。
~~~php
<?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 integer
echo Carbon::now(1)->tzName; // Europe/London
~~~
你将会喜欢上用 parse() 方法来代替原有繁琐的构造方式
~~~php
<?php
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
~~~
类似 now() 这样直接返回 Carbon 实例的方法还有 today(), tomorrow(),yesterday(),他们都接受一个 timezone 类型的参数,最后得到的结果时间部分都是 00:00:00
~~~php
<?php
$now = Carbon::now();
echo $now; // 2018-12-14 15:18:34
$today = Carbon::today();
echo $today; // 2018-12-14 00:00:00
$tomorrow = Carbon::tomorrow('Europe/London');
echo $tomorrow; // 2018-12-15 00:00:00
$yesterday = Carbon::yesterday();
echo $yesterday; // 2018-12-13 00:00:00
~~~
下面是一些其他的 creatXXX() 形式的静态方法。绝大多数静态方法的参数是可传可不传的,如果不传的话会使用方法预设的默认值,这些预设值一般都是针对当前日期、时间、时区的。如果为传递某个必要参数,会抛出一个[InvalidArgumentException](http://php.net/manual/en/class.invalidargumentexception.php)类型的异常,用[DateTime::getLastErrors()](http://php.net/manual/en/datetime.getlasterrors.php)方法可以得到异常的详细信息。
~~~php
<?php
Carbon::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
<?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 found
try { Carbon::create(1975, 5, 21, 22, -2, 0); } catch(InvalidArgumentException $x) { echo $x->getMessage(); }
~~~
copy() 方法可以copy一个已经存在的 Carbon 实例。对copy生成实例进行修改并不会影响被copy对象的本身。
~~~php
<?php
$dt = Carbon::now();
echo $dt->diffInYears($dt->copy()->addYear()); // 1
// $dt was unchanged and still holds the value of Carbon:now()
~~~
关于毫秒的一些处理。php自带的 DateTime 类也可以设置毫秒,但是在进行日期的数学预算时并不会考虑毫秒。从 Carbon 1.12.0版本起,实例化、copy也能像 format() 方法一样支持毫秒(PHP默认的只有[Datetime::format()](http://php.net/manual/en/datetime.format.php)支持毫秒)。
~~~php
<?php
$dt = Carbon::parse('1975-05-21 22:23:00.123456');
echo $dt->micro; // 123456
echo $dt->copy()->micro; // 123456
~~~
…等等…
# Carbon的一些使用
~~~php
$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();
~~~
**以下是当前支持的时间转换字**
1. this
2. net
3. last
4. this
5. next
6. last
7. tomorrow
8. yesterday
9. “+”
10. “-”
11. first
12. last
13. ago
~~~php
//1、基本应用
$now = Carbon::now(); //2018-12-14 14:13:16
$today = Carbon::today(); //2018-12-14 00:00:00
$tomorrow = Carbon::tomorrow(); //2018-12-15 00:00:00
$yesterday = Carbon::yesterday(); //2018-12-13 00:00:00
//2、判断是否是某一天(2018-12-14(周五)举例)
$now = Carbon::now();
var_dump($now->isWeekend());//false 因为周五不是周末
var_dump($now->isWeekday());//true 因为周五是工作日
var_dump($now->isFriday());//true 因为今天是周五
$now->isToday();
$now->isTomorrow();
$now->isFuture();
$now->isPast();
//3、创建某一天的carbon对象并且进行加减计算
$date = Carbon::create(2016, 12, 25, 0, 0, 0);//2016-12-25 00:00:00
$next_year=$date->addYears(2);//2018-12-25 00:00:00
$past_year=$date->subYears(2);//2014-12-25 00:00:00
$next_month=$date->addMonths(2);//2017-02-25 00:00:00
$past_month=$date->subMonths(2);//2016-10-25 00:00:00
$next_day=$date->addDays(2);//2016-12-27 00:00:00
$past_day=$date->subDays(2);//2016-12-23 00:00:00
...更有addWeekdays()、addWeeks()、addHours()等方法
//4、将carbon对象转换成string类型
$dt = Carbon::create(1975, 12, 25, 14, 15, 16);
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
//5、两个时间的比较
$first = Carbon::create(2018, 12, 25, 0, 0, 0);
$second = Carbon::create(2016, 12, 25, 0, 0, 0);
var_dump($first->eq($second));
var_dump($first->ne($second));
var_dump($first->gt($second));
var_dump($first->gte($second));
var_dump($first->lt($second));
var_dump($first->lte($second));
//6、简单的周月
$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
~~~
上面介绍的是一些基本的Carbon使用。Carbon最大的特点就是灵活、人性化。
- 说明
- PHP快递模式(一键同步多服务器程序文件)
- 多服务器文件md5对比
- 差异文件打包压缩
- 上传压缩包
- 接收压缩包
- 下载压缩包
- 解压覆盖文件
- 数据库同步
- 数据字典与数据库创建
- 数据表测试数据
- 文件对比方法
- think-orm包
- think-orm数据操作模型包
- think-orm数据库操作包
- think-migration数据库迁移包
- think-migration数据库填充数据
- think-migration数据库创建数据表
- think-migration数据库查询数据
- Phinx数据库迁移包
- Phinx数据库填充数据
- Phinx数据库创建数据表
- Phinx数据库查询数据
- 统一生成数据表,模型与数据表数据包
- 统一生成数据表
- 统一生成数据表数据
- 统一生成数据表模型
- 在线文档与测试服务
- 自动生成api接口在线测试
- 自动生成api在线文档
- 自动生成api接口ajax测试示例
- 管理后台页面(可以多个)
- 后台首页
- 后台配置页面
- 列表页面
- 表单页面
- 树状列表页面
- 树状表单页面
- 管理后台程序
- 树状表单添加与修改保存
- 一般表单添加与修改保存
- 树状列表展示
- 一般列表
- 配置页面
- 文件压缩与解压
- 文件压缩
- 文件解压
- 仿token操作
- 生成token
- 解析token
- 加解密组件hashids/hashids
- 随机事件
- 随机数生成
- 随机字符串
- 随机中文字符串
- 随机中文姓名
- 随机密码串
- redis操作
- 异步操作
- 后台表单操作
- 后台列表页面操作
- 模板文件生成新文件操作
- 按模板生成文件
- 生成模型文件
- 生成门面类
- 字符串操作
- 字符串包含
- 字符串排除前一个字符
- 字符串排除前N个字符
- 字符串排除前面一个字符串
- 字符串排除后一个字符
- 字符串排除后N个字符
- 字符串排除后面一个字符串
- 字符串截取
- 数组操作
- 交集
- 并集
- 差集
- 时间戳操作
- 上个月第一天日期
- 上个月最后一天日期
- 本月第一天日期
- 本月最后一天日期
- 下个月第一天日期
- 下个月最后一天日期
- 日期和时间处理组件-Carbon手册
- 日期和时间处理组件-Carbon
- PHP 使用Carbon扩展进行时间处理
- Carbon类
- bootstrap操作
- 表格
- 警告框
- 徽章
- 文件操作
- 文件上传
- 图片操作
- 图片上传
- 图片压缩
- 图片水印
- intervention/image使用
- log日志操作
- url操作
- url生成实例
- url解析实例
- 树状操作
- workerman操作
- 数据库备份
- 门面操作
- 门面操作测试
- 数据字典生成
- 二维码操作
- 二维码生成
- logo二维码
- think-cache缓存
- phpoffice/phpexcel使用
- Curl采集包
- 使用Guzzle执行HTTP请求
- fzaninotto/Faker中文填充数据表
- 安装faker
- Faker创建假数据
- Faker基础数据(英文)
- faker的Lorem(中文)
- 生成Person人物信息
- 生成Address地址信息
- 生成手机号Phone Number
- 生成公司Company信息
- 生成其他中文信息
- 生成时间日期Datetime