Carbon文档 ---- 2022-03-11

  1. 安装
    可以通过 Composer 来安装 Carbon:
composer require nesbot/carbon

由于 Laravel 项目已默认安装了此包,所以不需要再次执行上面的命令。
你需要通过命名空间导入 Carbon 来使用,而不需每次都提供完整的名称。

use Carbon\Carbon;

获取当前时间
可以同 now() 方法获取当前的日期和时间。如果你不指定参数,它会使用 PHP 配置中的时区:

echo Carbon::now(); // 2022-03-19 05:16:17

如果你想使用一个不同的时区,你需要传递一个有效的时区作为参数:

// 直接使用字符串
echo Carbon::now('Europe/London'); // 2022-03-19 05:23:07
// 或者
echo Carbon::now(new DateTimeZone('Europe/London'));

除 now() 外,还提供了 today()、tomorrow()、yesterday() 等静态函数,不过,它们的时间都是 00:00:00 :

echo Carbon::now();                              // 2022-03-19 05:16:17
echo Carbon::today();                            // 2022-03-19 00:00:00
echo  Carbon::tomorrow();                    // 2022-03-20 00:00:00
echo  Carbon::tomorrow('Europe/London');    // 2022-03-20 00:00:00
echo Carbon::yesterday();                              // 2022-03-18 00:00:00

以上输出结果其实是一个 Carbon 类型的日期时间对象:

Carbon {#179 ?
  +"date": "2022-03-19 00:00:00.000000"
  +"timezone_type": 3
  +"timezone": "UTC"
}

要想获取字符串类型的日期,可以使用下面的代码:

echo Carbon::today()->toDateTimeString();
echo Carbon::yesterday()->toDateTimeString();
echo Carbon::tomorrow()->toDateTimeString();

日期类型转为字符串
如上所述,默认情况下,Carbon 的方法返回的为一个日期时间对象。虽然它是一个对象,但是你却可以直接使用 echo 输出结果,因为有 __toString 魔术方法。但是如果你想把它转为字符串,可以使用 toDateString 或 toDateTimeString 方法:

echo Carbon::now()->toDateString(); // 2022-03-19

echo Carbon::now()->toDateTimeString(); // 2022-03-19 13:39:20

日期解析
你还可以使用 parse 方法解析任何顺序和类型的日期(结果为 Carbon 类型的日期时间对象):

echo Carbon::parse('2022-03-19')->toDateTimeString(); // 2022-03-19 00:00:00
echo Carbon::parse('2022-03-19 13:39:20')->toDateTimeString(); // 2022-03-19 13:39:20
 
echo Carbon::parse('today')->toDateTimeString(); //2022-03-19 00:00:00
echo Carbon::parse('yesterday')->toDateTimeString(); //2022-03-18 00:00:00
echo Carbon::parse('tomorrow')->toDateTimeString(); //2022-03-20 00:00:00
echo Carbon::parse('2 days ago')->toDateTimeString(); //2022-03-17 13:46:01     两天前时间

echo Carbon::parse('+3 days')->toDateTimeString(); //2022-03-22 13:46:59  三天后时间
echo Carbon::parse('+2 weeks')->toDateTimeString(); //2022-04-02 13:48:31   两周后时间
echo Carbon::parse('+4 months')->toDateTimeString(); //2022-07-19 13:50:24   四个月后时间
echo Carbon::parse('-1 year')->toDateTimeString(); // 2021-03-19 13:49:24   一年前时间 
echo Carbon::parse('next wednesday')->toDateTimeString(); // 2022-03-23 00:00:00 下周三时间
echo Carbon::parse('last friday')->toDateTimeString(); // 2022-03-18 00:00:00 过去一天时间

构造日期
你还可以使用单独的年月日来构造日期:

$year = '2022';
$month = '03';
$day = '19';

echo Carbon::createFromDate($year, $month, $day); //2022-03-19 13:53:49

$hour = '13';
$minute = '53';
$second = '49';

echo Carbon::create($year, $month, $day, $hour, $minute, $second); //2022-03-19 13:53:49

echo Carbon::createFromDate(null, 03, 19);  // 年默认为当前年份

此外,还可以传递一个有效的时区作为最后一个参数。
日期操作
日期操作可以通过 add (增加)或 sub (减去)跟上要增加或减去的单位来完成。例如,你想给一个日期增加指定的天数,你可以使用 addDays 方法。此外还提供了一个 modify 方法,参数格式为 + 或 - 跟上值及单位。所以,如果你想给当前日期增加一年,你可以传递 +1 year:

echo Carbon::now()->addDays(25); //2016-11-09 14:00:01
echo Carbon::now()->addWeeks(3); //2016-11-05 14:00:01
echo Carbon::now()->addHours(25); //2016-10-16 15:00:01
echo Carbon::now()->subHours(2); //2016-10-15 12:00:01
echo Carbon::now()->addHours(2)->addMinutes(12); //2016-10-15 16:12:01
echo Carbon::now()->modify('+15 days'); //2016-10-30 14:00:01
echo Carbon::now()->modify('-2 days'); //2016-10-13 14:00:01

日期比较
在 Carbon 中你可以使用下面的方法来比较日期:
min –返回最小日期。
max – 返回最大日期。
eq – 判断两个日期是否相等。
gt – 判断第一个日期是否比第二个日期大。
lt – 判断第一个日期是否比第二个日期小。
gte – 判断第一个日期是否大于等于第二个日期。
lte – 判断第一个日期是否小于等于第二个日期。

echo Carbon::now()->tzName;                        // America/Toronto
$first = Carbon::create(2012, 9, 5, 23, 26, 11);
$second = Carbon::create(2012, 9, 5, 20, 26, 11, 'America/Vancouver');
 
echo $first->toDateTimeString();                   // 2012-09-05 23:26:11
echo $first->tzName;                               // America/Toronto
echo $second->toDateTimeString();                  // 2012-09-05 20:26:11
echo $second->tzName;                              // America/Vancouver
 
var_dump($first->eq($second));                     // bool(true)
var_dump($first->ne($second));                     // bool(false)
var_dump($first->gt($second));                     // bool(false)
var_dump($first->gte($second));                    // bool(true)
var_dump($first->lt($second));                     // bool(false)
var_dump($first->lte($second));                    // bool(true)
 
$first->setDateTime(2012, 1, 1, 0, 0, 0);
$second->setDateTime(2012, 1, 1, 0, 0, 0);         // Remember tz is 'America/Vancouver'
 
var_dump($first->eq($second));                     // bool(false)
var_dump($first->ne($second));                     // bool(true)
var_dump($first->gt($second));                     // bool(false)
var_dump($first->gte($second));                    // bool(false)
var_dump($first->lt($second));                     // bool(true)
var_dump($first->lte($second));                    // bool(true)

要判断一个日期是否介于两个日期之间,可以使用 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)

此外还提供了一些辅助方法,你可以从它们的名字中明白其含义:

$dt = Carbon::now();
 
$dt->isWeekday();
$dt->isWeekend();
$dt->isYesterday();
$dt->isToday();
$dt->isTomorrow();
$dt->isFuture();
$dt->isPast();
$dt->isLeapYear();
$dt->isSameDay(Carbon::now());
$born = Carbon::createFromDate(1987, 4, 23);
$noCake = Carbon::createFromDate(2014, 9, 26);
$yesCake = Carbon::createFromDate(2014, 4, 23);
$overTheHill = Carbon::now()->subYears(50);
var_dump($born->isBirthday($noCake));              // bool(false)
var_dump($born->isBirthday($yesCake));             // bool(true)
var_dump($overTheHill->isBirthday());              // bool(true) -> default compare it to today!

diffForHumans
“一个月前”比“30 天前”更便于阅读,很多日期库都提供了这个常见的功能,日期被解析后,有下面四种可能性:

当比较的时间超过当前默认时间:1天前 5月前

当用将来的时间与当前默认时间比较: 1小时距现在,5月距现在

当比较的值超过另一个值
1小时前
5月前
当比较的值在另一个值之后
1小时后
5月后

你可以把第二个参数设置为 true 来删除“前”、“距现在”等修饰语:diffForHumans(Carbon $other, true)。

echo Carbon::now()->subDays(5)->diffForHumans();               // 5天前
 
echo Carbon::now()->diffForHumans(Carbon::now()->subYear());   // 1年后
 
$dt = Carbon::createFromDate(2011, 8, 1);
 
echo $dt->diffForHumans($dt->copy()->addMonth());              // 1月前
echo $dt->diffForHumans($dt->copy()->subMonth());              // 11月后
 
echo Carbon::now()->addSeconds(5)->diffForHumans();            // 5秒距现在,即5秒后时间;-5,5秒前时间
 
echo Carbon::now()->subDays(24)->diffForHumans();              // 3周前
echo Carbon::now()->subDays(24)->diffForHumans(null, true);    // 3周

Carbon 获取指定精度的时间戳:

Carbon::now()->getPreciseTimestamp(3); //获取毫秒时间戳

Carbon 源码里有:

    /**
     * Returns a timestamp rounded with the given precision (6 by default).
     *
     * @example getPreciseTimestamp()   1532087464437474 (微秒最大精度)
     * @example getPreciseTimestamp(6)  1532087464437474
     * @example getPreciseTimestamp(5)  153208746443747  (1/100000 秒精度)
     * @example getPreciseTimestamp(4)  15320874644375   (1/10000 秒精度)
     * @example getPreciseTimestamp(3)  1532087464437    (毫秒 precision)
     * @example getPreciseTimestamp(2)  153208746444     (1/100 秒精度)
     * @example getPreciseTimestamp(1)  15320874644      (1/10 秒精度)
     * @example getPreciseTimestamp(0)  1532087464       (秒精度)
     * @example getPreciseTimestamp(-1) 153208746        (10 秒精度)
     * @example getPreciseTimestamp(-2) 15320875         (100 秒精度)
     *
     * @param int $precision
     *
     * @return float
     */
    public function getPreciseTimestamp($precision = 6);

其他:

//显示中文
Carbon::setLocale('zh');
//获取昨天的时间戳
ts = Carbon::yesterday()->timestamp; // 将时间格式转化为时间戳 //人性化显示时间 echo Carbon::createFromTimestamp(ts)->diffForHumans(); // 输出。“1天前”

//2、判断是否是某一天(2016-11-03(周四)举例)
now = Carbon::now(); var_dump(now->isWeekend());//false 因为周四不是周末
var_dump(now->isWeekday());//true 因为周四是工作日 var_dump(now->isThursday());//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:00next_year=date->addYears(2);//2018-12-25 00:00:00past_year=date->subYears(2);//2014-12-25 00:00:00next_month=date->addMonths(2);//2017-02-25 00:00:00past_month=date->subMonths(2);//2016-10-25 00:00:00next_day=date->addDays(2);//2016-12-27 00:00:00past_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 echodt->toFormattedDateString(); // Dec 25, 1975
echo dt->toTimeString(); // 14:15:16 echodt->toDateTimeString(); // 1975-12-25 14:15:16
echo $dt->toDayDateTimeString(); // Thu, Dec 25, 1975 2:15 PM

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 穷其一生,只为了一家人的温饱,为了后代的延续……50后的老人们真的可悲,自己辛苦了一辈子,最后还要让自己的儿子一辈...
    1ba228d6e6ad阅读 179评论 0 0
  • 每日一省 感受他的感受 早上起来正做饭,老公从外边回来了,我问他出去有啥事了?他恼哋哋的说送孩子到了书包没...
    王兰芳阅读 139评论 0 2
  • 中原焦点团队高级6期肖巧风,坚持分享第702天 《叙事疗法实践地图》中咨询师与外部见证人对话所依据的。四种提问方式...
    凤舞九天阅读 180评论 0 1
  • 落幕的叶在风的伴奏中远去 雪白的纱层层裹住了大地 冷冽的风在耳边呼啸 柔软的心不小心套上了坚硬的外壳
    蝶露阅读 152评论 0 1
  • 温柔 (小说) 喜欢着一件黑色夜行衣的少年,已经跋涉了很长时间。是为躲避仇家的追杀,还是为了追赶某一个猎物?不得而...
    岁月巍巍阅读 289评论 0 1