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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

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