简介
这个库的名字其实就很有意思:“carbon”,是化学元素的名字“碳”,为什么叫这个名字呢?在科学界,有一个"放射性碳定年法"的东西,是一种利用碳的同位素14C的放射性来对含有有机物质的物品进行年代测定的方法。从这意义上讲,他是要处理时间的。
我们在开发中,经常需要处理时间的格式化显示。比如计算两个时间差多长时间,明天的时间,本周的时间,以及人性化的输出“几天前”时间变化,这时候我们可能会手忙脚乱的去网上复制代码,最后搞得代码乱糟糟的。
但实际上,这些用这一个库都能实现:
实例
安装
composer require nesbot/carbon
精简却全面的案例
<?php
$date = Carbon::now()->locale('zh_CN');
echo "\n";
echo $date->locale();
echo "\n";
echo $date->diffForHumans('2023-08-13');
echo "\n";
echo $date->monthName;
echo "\n";
echo $date->isoFormat('LLLL');
输出如下:
2023年4月28日星期五早上8点03分zh_CN
3个月前
四月
2023年4月28日星期五早上8点03分
在上面的例子中,几乎没有任何逻辑代码,只是通过静态方法创建了一个对象,然后调用输出就可以。
在上面,我们创建了当前时间,按照本地化输出时间,同时对比一下相较于给定的时间还差多久,输出一下月份。
多种设置时间的方式
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->setDate(1975, 5, 21)->setTimeFromTimeString('22:32:05')->toDateTimeString();
$dt->setDateTime(1975, 5, 21, 22, 32, 5)->toDateTimeString();
// All allow microsecond as optional argument
$dt->year(1975)->month(5)->day(21)->hour(22)->minute(32)->second(5)->microsecond(123456)->toDateTimeString();
$dt->setDate(1975, 5, 21)->setTime(22, 32, 5, 123456)->toDateTimeString();
$dt->setDate(1975, 5, 21)->setTimeFromTimeString('22:32:05.123456')->toDateTimeString();
$dt->setDateTime(1975, 5, 21, 22, 32, 5, 123456)->toDateTimeString();
$dt->timestamp(169957925); // Note: timestamps are UTC but do not change the date timezone
$dt->timezone('Europe/London')->tz('America/Toronto')->setTimezone('America/Vancouver');
轻松地获取到时间周期
我们会经常去获取开始时间爱你和结束时间,比如一天的开始时间和结束时间,本周的开始时间和结束时间,今年的开始时间和结束时间,现在用它几乎不需要任何处理,直接调用内置方法就够了。
$dt = new Carbon('2012-01-31 15:32:45.654321');
echo $dt->startOfSecond()->format('s.u'); // 45.000000
$dt = new Carbon('2012-01-31 15:32:45.654321');
echo $dt->endOfSecond()->format('s.u'); // 45.999999
$dt = new Carbon('2012-01-31 15:32:45.654321');
echo $dt->startOf('second')->format('s.u'); // 45.000000
$dt = new Carbon('2012-01-31 15:32:45.654321');
echo $dt->endOf('second')->format('s.u'); // 45.999999
// ->startOf() and ->endOf() are dynamic equivalents to those methods
$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);
echo Carbon::getMidDayAt(); // 13
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
$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
$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfCentury(); // 2100-12-31 23:59:59
$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfWeek(); // 2012-01-30 00:00:00
var_dump($dt->dayOfWeek == Carbon::MONDAY); // bool(true) : ISO8601 week starts on Monday
$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfWeek(); // 2012-02-05 23:59:59
var_dump($dt->dayOfWeek == Carbon::SUNDAY); // bool(true) : ISO8601 week ends on Sunday
$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->next(Carbon::WEDNESDAY); // 2012-02-01 00:00:00
var_dump($dt->dayOfWeek == Carbon::WEDNESDAY); // bool(true)
echo $dt->next('Wednesday'); // 2012-02-08 00:00:00
echo $dt->next('04:00'); // 2012-02-08 04:00:00
echo $dt->next('12:00'); // 2012-02-08 12:00:00
echo $dt->next('04:00'); // 2012-02-09 04:00:00
$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
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
echo Carbon::create(2014, 5, 30, 0, 0, 0)->firstOfQuarter(); // 2014-04-01 00:00:00
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
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:00
echo 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
更多用法
实际上carbon还有很多的用法,比如跨时区计算实际的发生时差,按各种不同的标准输出等等。
特点
1. 易学易用:Carbon扩展了PHP的DateTime类,使其更加友好、易学。
2. 链式操作:Carbon支持链式操作,可以在一行代码中完成多个日期操作。
3. 兼容性强:由于基于PHP DateTime类,Carbon具有与PHP内置DateTime的大部分功能和兼容性,因此在很多地方都可以直接替换原生的DateTime类。
4. 多语言支持:Carbon支持多语言,可以根据需要设置日期的语言格式。
总之,nesbot/carbon是一个十分实用的日期时间处理扩展库,具有易学易用、链式操作、兼容性强、多语言支持等多个优点。它简化了PHP的日期处理代码,让开发更加高效、快捷。
原文标题:[nesbot/carbon]轻松优雅的驾驭时间处理
原文地址:https://phpreturn.com/index/a644b5fd15ec31.html
原文平台:PHP武器库
版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。