时间组件nesbot/carbon[实战系列]

简介

这个组件的
Carbon 类继承 \DateTime 类
CarbonImmutable 类继承 \DateTimeImmutable
CarbonInterval 类继承 \DateInterval
CarbonTimeZone 类继承 \DateTimeZone
CarbonPeriod 类继承 \DatePeriod

时间存储

数据库应该存储完整的日期和时间,如果你只存储年月日的日期,那你的应用只能在1个时区工作,永远没法和其他时间兼容

如果你的项目有全球性跨时区的属性,请在项目刚刚开始的时候把UTC用作应用程序的默认时区(包括数据库)
另外一种方式就是把时区存到时间字段里
兜底的方式就是时间全部存时间戳

假期

可以结合这个子组件实现假期操作 Cmixin\BusinessDay,比如遇到某个任务要在美国时间七个工作日后开启的需求时

echo date('c', time());
//2023-05-11T15:05:19+08:00

各种实例化方式

Carbon::create(2012, 1, 1, 0, 0, 0, 'America/Toronto'); // 年月日时分秒 时区
Carbon::now(); // 默认 date_default_timezone_set 时区 : 2023-05-12 11:26:27
Carbon::now(new DateTimeZone('Europe/London')); // DateTimeZone对象设置时区 : 2023-05-12 04:27:32
Carbon::now('Europe/London');    // 字符串形式设置时区
Carbon::now('+13:30'); // UTC+13:30 的时间 : 2023-05-12 19:27:31
new Carbon(); // 相当于Carbon::now() :  2023-05-12 11:26:27
new Carbon('first day of January 2008', 'America/Vancouver'); // 语义化创建实例 : 2008-01-01 00:00:00
new Carbon(new DateTime('first day of January 2008'), new DateTimeZone('America/Vancouver')); // 2007-12-31 08:00:00
Carbon::parse('first day of December 2008'); //语义化创建实例 : 2008-12-15 00:00:00
Carbon::today(); // 今天 : 2023-05-15 00:00:00
Carbon::tomorrow('Europe/London'); // 明天 : 2023-05-16 00:00:00
Carbon::yesterday(); // 昨天 : 2023-05-14 00:00:00

$year = 2000;$month = 4;$day = 19;$hour = 20;$minute = 30;$second = 15;$tz = 'Europe/Madrid';
Carbon::createFromDate($year, $month, $day, $tz); // 2000-04-19 08:49:14
Carbon::createMidnightDate($year, $month, $day, $tz); // 2000-04-19 00:00:00
Carbon::createFromTime($hour, $minute, $second, $tz); // 2023-05-15 20:30:15
Carbon::createFromTimeString("$hour:$minute:$second", $tz); // 2023-05-15 20:30:15
Carbon::create($year, $month, $day, $hour, $minute, $second, $tz); // 2000-04-19 20:30:15
Carbon::createFromFormat('Y-m-d H', '1975-05-21 22')->toDateTimeString(); // 指定格式组成时间 1975-05-21 22:00:00
Carbon::createFromIsoFormat('!YYYY-MMMM-D h:mm:ss a', '2019-January-3 6:33:24 pm', 'UTC');  // 指定格式组成时间

// 通过时间戳实例化
Carbon::createFromTimestamp(-1)->toDateTimeString(); // 北京时间 : 1970-01-01 07:59:59
Carbon::createFromTimestamp(-1.5, 'Europe/London')->toDateTimeString(); // 伦敦时间 : 1970-01-01 00:59:58
Carbon::createFromTimestampUTC(-1)->toDateTimeString(); // UTC时间 : 1969-12-31 23:59:59
Carbon::createFromTimestamp('1601735792.198956', 'Europe/London')->format('Y-m-d\TH:i:s.uP'); // 毫秒级时间戳 : 2020-10-03T15:36:32.198956+01:00
Carbon::createFromTimestampUTC('0.198956 1601735792')->format('Y-m-d\TH:i:s.uP'); // 毫秒级时间戳另一种格式 : 2020-10-03T14:36:32.198956+00:00

Carbon::maxValue(); // '9999-12-31 23:59:59' 
Carbon::minValue(); // '0001-01-01 00:00:00'

Getter

$dt = Carbon::parse('2012-10-5 23:26:11.123789');
$dt->year;                                         // 2012 年
$dt->month;                                        // 10 月
$dt->day;                                          // 5 日
$dt->hour;                                         // 23 时
$dt->minute;                                       // 26 分
$dt->second;                                       // 11 秒
$dt->micro;                                        // 123789 微妙
$dt->dayOfWeek;                                    // 周日是0
$dt->dayOfWeekIso;                                 // 周日是7
$dt->englishDayOfWeek;                             // "Friday" 英文周
$dt->shortEnglishDayOfWeek;                        // "Fri" 英文周简写
$dt->locale('zh')->dayName;  // "星期五"
$dt->locale('zh')->shortDayName;  // "周五"
$dt->locale('zh')->minDayName; // "五"
$dt->englishMonth;  // "October"
$dt->shortEnglishMonth;  // "Oct"
$dt->locale('zh')->monthName; // "十月"
$dt->locale('zh')->shortMonthName; // "10月"
$dt->dayOfYear;  // 279 当年的第几天
$dt->weekOfYear;  // 40 当年的第几周
$dt->weekNumberInMonth; // 1 当月的第几周 按周一到周日算一周
$dt->weekOfMonth;  // 1 当月的第几周 按1号-7号算一周
$dt->daysInMonth;  //31 本月有多少天
$dt->timestamp; //  // 1349479571 int整型时间戳
$dt->getTimestamp(); // 1349479571 int整型时间戳
$dt->getTimestampMs(); // 1349479571124 int整型微妙时间戳
$dt->valueOf();  // 1349479571124 float微妙时间戳
$dt->getPreciseTimestamp(6); // 1349479571123789 float微妙时间戳 6位小数
$dt->quarter; // 4 第几个季度

Carbon::createFromDate(1990, 5, 21)->age;  //32  1990-5-21出生的人现在几岁
Carbon::createFromTimestampUTC(0)->offset; // 0 与UTC的秒差
Carbon::createFromTimestamp(0, 'Europe/Paris')->offset;  // 3600 与UTC的秒差
Carbon::createFromTimestamp(0, 'Europe/Paris')->getOffset(); // 3600 与UTC的秒差
Carbon::createFromTimestamp(0, 'Europe/Paris')->offsetMinutes;         // 60 与UTC的分差
Carbon::createFromTimestamp(0, 'Europe/Paris')->offsetHours;           // 1 与UTC的时差
Carbon::createFromTimestamp(0, 'Europe/Paris')->getOffsetString();     // +01:00 时区差字符串

// 当前时区是否默认时区 默认时区是上海
Carbon::now()->local; // true
Carbon::now('America/Vancouver')->local;  // false
Carbon::now()->isLocal(); // true
Carbon::now('America/Vancouver')->isLocal();// false
Carbon::now()->isUtc(); // false
Carbon::now('America/Vancouver')->isUtc(); // false
Carbon::now()->utc; // false 是否utc时区
Carbon::parse('2018-10-01', 'Europe/London')->utc; // false 伦敦夏天的时区不是UTC
Carbon::parse('2018-11-01', 'Europe/London')->utc; // true  伦敦冬天的时区是UTC

get_class(Carbon::now()->timezone);   // Carbon\CarbonTimeZone
get_class(Carbon::now()->tz); // Carbon\CarbonTimeZone
Carbon::now()->timezoneName; // Asia/Shanghai
Carbon::now()->tzName;  // Asia/Shanghai
Carbon::now()->get('second'); // 5 当前的秒钟
Carbon::now()->second; // 5 当前的秒钟 跟上面一样
Carbon::now()->get(Carbon::singularUnit('seconds'));  // 5 如果单位是复数,需要使用singularUnit
Carbon::pluralUnit('century'); // centuries
Carbon::pluralUnit('millennium'); // millennia

setter

$dt = Carbon::now();
$dt->year = 1975;
$dt->month = 13;             // year++ 且 month = 1
$dt->month = 5;
$dt->day = 21;
$dt->hour = 22;
$dt->minute = 32;
$dt->second = 5;
$dt->timestamp = 169957925;  // 设置时间戳
$dt->setTimestamp(169957925);  // 设置时间戳
$dt->timestamp(169957925);  // 设置时间戳
$dt->tz = new DateTimeZone('Europe/London'); // 设置时区
$dt->tz = 'Europe/London'; // 设置时区
$dt->dayOfYear(35)->format('Y-m-d'); // 1975-02-04 当年的第35天

格式化

$dt = Carbon::create(1975, 12, 25, 14, 15, 16);
$dt->toDateTimeString() == $dt; // true  toDateTimeString 等于 __toString()
$dt->toDateString(); // 1975-12-25
$dt->toFormattedDateString(); // Dec 25, 1975
$dt->toFormattedDayDateString(); // Thu, Dec 25, 1975
$dt->toTimeString(); // 14:15:16
$dt->toDateTimeString(); // 1975-12-25 14:15:16
$dt->toDayDateTimeString(); // Thu, Dec 25, 1975 2:15 PM
$dt->format('l jS \\of F Y h:i:s A');   // Thursday 25th of December 1975 02:15:16 PM
Carbon::hasFormat('Thursday 25th December 1975 02:15:16 PM', 'l jS F Y h:i:s A'); // bool(true)

$dt = Carbon::createFromFormat('Y-m-d H:i:s.u', '2019-02-01 03:45:27.612584');
echo $dt->toAtomString(); // 2019-02-01T03:45:27+00:00
echo $dt->toCookieString(); // Friday, 01-Feb-2019 03:45:27 UTC
echo $dt->toIso8601String(); // 2019-02-01T03:45:27+00:00
echo $dt->format(DateTime::ISO8601); // 2019-02-01T03:45:27+0000
echo $dt->toISOString(); // 2019-02-01T03:45:27.612584Z
echo $dt->toJSON(); // 2019-02-01T03:45:27.612584Z
echo $dt->toIso8601ZuluString(); // 2019-02-01T03:45:27Z
echo $dt->toDateTimeLocalString(); // 2019-02-01T03:45:27
echo $dt->toRfc822String(); // Fri, 01 Feb 19 03:45:27 +0000
echo $dt->toRfc850String(); // Friday, 01-Feb-19 03:45:27 UTC
echo $dt->toRfc1036String(); // Fri, 01 Feb 19 03:45:27 +0000
echo $dt->toRfc1123String(); // Fri, 01 Feb 2019 03:45:27 +0000
echo $dt->toRfc2822String(); // Fri, 01 Feb 2019 03:45:27 +0000
echo $dt->toRfc3339String(); // 2019-02-01T03:45:27+00:00
echo $dt->toRfc7231String(); // Fri, 01 Feb 2019 03:45:27 GMT
echo $dt->toRssString(); // Fri, 01 Feb 2019 03:45:27 +0000
echo $dt->toW3cString(); // 2019-02-01T03:45:27+00:00

时间比较

$first = Carbon::create(2012, 9, 5, 23, 26, 11);
$second = Carbon::create(2012, 9, 5, 20, 26, 11, 'America/Vancouver');
$first->equalTo($second); // false 是否相等
$first->eq($second); // false 同equalTo
$first == $second; // false 同equalTo

$first->notEqualTo($second);  // true 是否不相等
$first->ne($second);  // true 同notEqualTo
$first != $second;// true 同notEqualTo

$first->greaterThan($second);  // false $first是否大于$second
$first->gt($second);  // false 同 greaterThan
$first->isAfter($second); // false  同 greaterThan
$first > $second; // false  同 greaterThan

$first->greaterThanOrEqualTo($second);   // false $first是否大于等于$second
$first->gte($second); // false  同 greaterThanOrEqualTo
$first->greaterThanOrEqualTo($second);   // false  同 greaterThanOrEqualTo
$first >= $second;// false  同 greaterThanOrEqualTo

$first->lessThan($second); // true $first是否小于$second
$first->lt($second);  // true 同 lessThan
$first->lessThan($second);// true 同 lessThan
$first->isBefore($second);// true 同 lessThan
$first < $second; // true 同 lessThan

$first->lessThanOrEqualTo($second);      // true $first是否小于等于$second
$first->lte($second); // true  同 lessThanOrEqualTo
$first->lessThanOrEqualTo($second);  // true 同 lessThanOrEqualTo
$first <= $second;// true 同 lessThanOrEqualTo


Carbon::create(2012, 9, 5, 3)->between($first, $second); // 是否在first second中间
Carbon::create(2012, 9, 5, 5)->between($first, $second, true);  // 是否在first second中间,包含first和second
Carbon::create(2012, 9, 5, 5)->isBetween($first, $second, false); // 是否在first second中间,不包含first和second
Carbon::create(2012, 9, 5, 5)->betweenIncluded($first, $second);  // 是否在first second中间,包含first和second
Carbon::create(2012, 9, 5, 5)->betweenExcluded($first, $second);  // 是否在first second中间,不包含first和second


$dt1 = Carbon::createMidnightDate(2012, 1, 1);
$dt2 = Carbon::createMidnightDate(2014, 1, 30);
$dt1->min($dt2); // 2012-01-01 00:00:00 返回$dt1 $dt2 最小值
$dt1->minimum($dt2); // 2012-01-01 00:00:00 返回$dt1 $dt2 最小值
$dt1->max($dt2);  // 2014-01-30 00:00:00 返回$dt1 $dt2 最大值
$dt1->maximum($dt2); // 2014-01-30 00:00:00 返回$dt1 $dt2 最大值
$dt1 = Carbon::createMidnightDate(2000, 1, 1);
$dt1->max(); // 2023-04-21 08:24:05 返回$dt1 现在 最大值
$dt1->maximum(); // 2023-04-21 08:24:05 返回$dt1 现在 最大值
max(Carbon::create('2002-03-15'), Carbon::create('2003-01-07'), Carbon::create('2002-08-25')); // 2003-01-07 00:00:00 三个时间最大值
min(Carbon::create('2002-03-15'), Carbon::create('2003-01-07'), Carbon::create('2002-08-25')); // 2002-03-15 00:00:00 三个时间最小值

$dt1 = Carbon::createMidnightDate(2010, 4, 1);
$dt2 = Carbon::createMidnightDate(2010, 3, 28);
$dt3 = Carbon::createMidnightDate(2010, 4, 16);

$dt1->closest($dt2, $dt3);  // 2010-03-28 00:00:00 返回最靠近$dt1的时间
$dt1->farthest($dt2, $dt3);  // 2010-04-16 00:00:00 返回最不靠近$dt1的时间


$dt = Carbon::now();
$dt2 = Carbon::createFromDate(1987, 4, 23);
$dt->isFuture(); // $dt 是否比当前时间大
$dt->isPast(); // $dt 是否比当前时间小
$dt->isSameYear($dt2); // $dt $dt2 是否同一年
$dt->isCurrentYear(); // $dt 是否在当年
$dt->isNextYear(); // $dt 是否明年
$dt->isLastYear(); // $dt 是否去年
$dt->isLeapYear(); // $dt 是否闰年
$dt->isSameQuarter($dt2); // $dt $dt2 是否同一季度
$dt->isSameQuarter($dt2, false); // $dt $dt2 是否同一季度,忽略年
$dt->isCurrentQuarter(); // $dt 是否当前季度
$dt->isNextQuarter(); // $dt 是否下个季度
$dt->isLastQuarter(); //  $dt 是否上个季度
$dt->isSameMonth($dt2); // $dt $dt2 是否同一月
$dt->isSameMonth($dt2, false); // $dt $dt2 是否同一月,忽略年
$dt->isCurrentMonth(); // $dt 是否当前月
$dt->isNextMonth(); //$dt 是否下个月
$dt->isLastMonth(); //$dt 是否上个月
$dt->isWeekday(); //$dt 是否工作日
$dt->isWeekend(); //$dt 是否周末
$dt->isMonday(); //$dt 是否周一
$dt->isTuesday(); //$dt 是否周二
$dt->isWednesday(); //$dt 是否周三
$dt->isThursday(); //$dt 是否周四
$dt->isFriday(); //$dt 是否周五
$dt->isSaturday(); //$dt 是否周六
$dt->isSunday(); //$dt 是否周日
$dt->isDayOfWeek(Carbon::SATURDAY); // $dt 是否周六
$dt->isLastOfMonth(); // 是否当月最后一天
$dt->is('Sunday'); //语义化
$dt->is('June');
$dt->is('2019');
$dt->is('12:23');
$dt->is('2 June 2019');
$dt->is('06-02');
$dt->isSameDay($dt2); // $dt $dt2 是否同一天
$dt->isCurrentDay(); // $dt 是否当天
$dt->isYesterday(); // $dt 是否昨天
$dt->isToday(); // $dt 是否今天
$dt->isTomorrow(); // $dt 是否明天
$dt->isNextWeek(); // $dt 是否下周
$dt->isLastWeek(); // $dt 是否上周
$dt->isSameHour($dt2); // $dt $dt2 是否同一个小时
$dt->isCurrentHour(); // $dt 是否同一个小时
$dt->isSameMinute($dt2); // $dt $dt2 是否同一分
$dt->isCurrentMinute(); // $dt 是否和现在同一分钟
$dt->isSameSecond($dt2); // $dt $dt2 是否同一秒
$dt->isCurrentSecond(); // $dt 是否和现在同一秒
$dt->isStartOfDay(); // $dt 时间是否是 00:00:00
$dt->isMidnight(); // $dt 时间是否是  00:00:00 同isStartOfDay
$dt->isEndOfDay(); // $dt 时间是否是 23:59:59
$dt->isMidday(); // $dt 时间是否是 12:00:00

$born = Carbon::createFromDate(1987, 4, 23);
$noCake = Carbon::createFromDate(2014, 9, 26);
$yesCake = Carbon::createFromDate(2014, 4, 23);
$born->isBirthday($noCake); // false $noCake 是否是$born的生日
$born->isBirthday($yesCake); // true $yesCake 是否是$born的生日
$overTheHill = Carbon::now()->subYears(50);
$overTheHill->isBirthday(); // true 今天是否是$overTheHill的生日

加减

$dt = Carbon::create(2012, 1, 31, 0);
$dt->addCenturies(5); // 2512-01-31 00:00:00 加5个世纪
$dt->addCentury(); // 2612-01-31 00:00:00 加1个世纪
$dt->subCentury(); // 2512-01-31 00:00:00 减1个世纪
$dt->subCenturies(5); // 2012-01-31 00:00:00 减5个世纪
$dt->addYears(5); // 2017-01-31 00:00:00 加5年
$dt->addYear(); // 2018-01-31 00:00:00 加1年
$dt->subYear(); // 2017-01-31 00:00:00 减1年
$dt->subYears(5); // 2012-01-31 00:00:00 减五年
$dt->addQuarters(2);  // 2012-07-31 00:00:00 季度操作
$dt->addQuarter(); // 2012-10-31 00:00:00
$dt->subQuarter(); // 2012-07-31 00:00:00
$dt->subQuarters(2); // 2012-01-31 00:00:00
$dt->addMonths(60); // 2017-01-31 00:00:00 月份操作
$dt->addMonth(); // 2017-03-03 00:00:00
$dt->subMonth(); // 2017-02-03 00:00:00
$dt->subMonths(60); // 2012-02-03 00:00:00
$dt->addDays(29); // 2012-03-03 00:00:00 日操作
$dt->addDay(); // 2012-03-04 00:00:00
$dt->subDay();// 2012-03-03 00:00:00
$dt->subDays(29); // 2012-02-03 00:00:00
$dt->addWeekdays(4); // 2012-02-09 00:00:00 工作日操作
$dt->addWeekday(); // 2012-02-10 00:00:00
$dt->subWeekday(); // 2012-02-09 00:00:00
$dt->subWeekdays(4); // 2012-02-03 00:00:00
$dt->addWeeks(3); // 2012-02-24 00:00:00 周操作
$dt->addWeek(); // 2012-03-02 00:00:00
$dt->subWeek(); // 2012-02-24 00:00:00
$dt->subWeeks(3); // 2012-02-03 00:00:00
$dt->addHours(24); // 2012-02-04 00:00:00 时操作
$dt->addHour(); // 2012-02-04 01:00:00
$dt->subHour(); // 2012-02-04 00:00:00
$dt->subHours(24); // 2012-02-03 00:00:00
$dt->addMinutes(61); // 2012-02-03 01:01:00 分操作
$dt->addMinute(); // 2012-02-03 01:02:00
$dt->subMinute(); // 2012-02-03 01:01:00
$dt->subMinutes(61); // 2012-02-03 00:00:00
$dt->addSeconds(61); // 2012-02-03 00:01:01 秒操作
$dt->addSecond(); // 2012-02-03 00:01:02
$dt->subSecond(); // 2012-02-03 00:01:01
$dt->subSeconds(61); // 2012-02-03 00:00:00
$dt->addMilliseconds(61); // 2012-02-03 00:00:00 毫秒操作
$dt->addMillisecond(); // 2012-02-03 00:00:00
$dt->subMillisecond(); // 2012-02-03 00:00:00
$dt->subMillisecond(61); // 2012-02-03 00:00:00
$dt->add(61, 'seconds'); // 2012-02-03 00:01:01 加61秒
$dt->sub('1 day'); // 2012-02-02 00:01:01 减1天
$dt->add(CarbonInterval::months(2)); // 2012-04-02 00:01:01 加两个月
$dt->subtract(new DateInterval('PT1H')); // 2012-04-01 23:01:01 减1个小时

日期差别

$dtOttawa = Carbon::createMidnightDate(2000, 1, 1, 'America/Toronto');
$dtVancouver = Carbon::createMidnightDate(2000, 1, 1, 'America/Vancouver');
$dtOttawa->diffInHours($dtVancouver); // 3 时差
$dtVancouver->diffInHours($dtOttawa, false); // -3 时差(有负数)

$dt = Carbon::createMidnightDate(2012, 1, 31);
$dt->diffInDays($dt->copy()->addMonth()); // 31 日差
$dt->diffInDays($dt->copy()->subMonth(), false); // -31 日差带负数
$dt->diffInMinutes($dt->copy()->addSeconds(59));  // 0 分差
$dt->addSeconds(120)->secondsSinceMidnight(); // 120 从00:00:00到现在的秒数
$interval = $dt->diffAsCarbonInterval($dt->copy()->subYears(3), false)->years; // 差三年

Carbon::parse('06:01:23.252987')->floatDiffInSeconds('06:02:34.321450'); // 71.068463 浮点表示秒差
Carbon::parse('06:01:23')->floatDiffInMinutes('06:02:34'); // 1.1833333333333 浮点表示分差
Carbon::parse('06:01:23')->floatDiffInHours('06:02:34'); // 0.019722222222222 浮点表示时差
Carbon::parse('12:01:23')->floatDiffInHours('06:02:34', false); // -5.9802777777778 浮点表示时差带负数
Carbon::parse('2000-01-01 12:00')->floatDiffInDays('2000-02-11 06:00'); // 40.75 浮点表示日差
Carbon::parse('2000-01-01')->floatDiffInWeeks('2000-02-11'); // 5.8571428571429 浮点表示周差
Carbon::parse('2000-01-15')->floatDiffInMonths('2000-02-24');  // 1.3103448275862 浮点表示月差
Carbon::parse('2000-02-15 12:00')->floatDiffInYears('2010-03-24 06:00');    // 10.100684931507 浮点表示年差

echo Carbon::now()->locale('zh')->subDays(5)->diffForHumans();               // 5天前

时间修改器

$dt = new Carbon('2012-01-31 15:32:45.654321');
$dt->startOfSecond()->format('s.u');          // 45.000000 秒初
$dt->startOf('second')->format('s.u');  // 45.000000 秒初
$dt->endOfSecond()->format('s.u');            // 45.999999 秒末
$dt->endOf('second')->format('s.u'); // 45.999999 秒末
$dt->startOfMinute(); // 2012-01-31 15:32:00 分初
$dt->endOfMinute(); // 2012-01-31 15:32:59 分末
$dt->startOfHour(); // 2012-01-31 15:00:00 时初
$dt->endOfHour(); // 2012-01-31 15:59:59 时末
Carbon::getMidDayAt(); // 12 中午时
$dt->midDay(); // 2012-01-31 12:00:00 $dt中午时间
$dt->startOfDay(); // 2012-01-31 00:00:00 日初
$dt->endOfDay(); // 2012-01-31 23:59:59 日末
$dt->startOfMonth(); // 2012-01-01 00:00:00 月初
$dt->endOfMonth();  // 2012-01-31 23:59:59 月末
$dt->startOfYear(); // 2012-01-01 00:00:00 年初
$dt->endOfYear(); // 2012-12-31 23:59:59 年末
$dt->startOfDecade(); // 2010-01-01 00:00:00 十年初
$dt->endOfDecade(); // 2019-12-31 23:59:59 十年末
$dt->startOfCentury(); // 2001-01-01 00:00:00 世纪初
$dt->endOfCentury(); // 2100-12-31 23:59:59 世纪末
$dt->startOfWeek(); // 2012-01-30 00:00:00 周初
$dt->endOfWeek();  // 2012-02-05 23:59:59 周末
$dt->next(Carbon::WEDNESDAY); // 2012-02-01 00:00:00 下一个周三
$dt->next('Wednesday'); // 2012-02-08 00:00:00 下一个周三
$dt->next('04:00'); // 2012-02-08 04:00:00 下一个4点

$dt = Carbon::create(2012, 1, 1, 12, 0, 0);
$dt->next(); // 2012-01-08 00:00:00 ??????没看懂
$dt->previous(Carbon::WEDNESDAY); // 2012-01-25 00:00:00 上周三
$dt = Carbon::create(2012, 1, 1, 12, 0, 0);
$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);
$start->average($end); // 2014-01-15 12:00:00 时间中点

Carbon::create(2014, 5, 30, 0, 0, 0)->firstOfMonth(); // 2014-05-01 00:00:00 月初
Carbon::create(2014, 5, 30, 0, 0, 0)->firstOfMonth(Carbon::MONDAY); // 2014-05-05 00:00:00 第一个周一
Carbon::create(2014, 5, 30, 0, 0, 0)->lastOfMonth(); // 2014-05-31 00:00:00 月末
Carbon::create(2014, 5, 30, 0, 0, 0)->lastOfMonth(Carbon::TUESDAY); // 2014-05-27 00:00:00 最后一个周二
Carbon::create(2014, 5, 30, 0, 0, 0)->nthOfMonth(2, Carbon::SATURDAY); // 2014-05-10 00:00:00 第二个周六

Carbon::create(2014, 5, 30, 0, 0, 0)->firstOfQuarter(); // 2014-04-01 00:00:00 季度操作
Carbon::create(2014, 5, 30, 0, 0, 0)->firstOfQuarter(Carbon::MONDAY); // 2014-04-07 00:00:00
Carbon::create(2014, 5, 30, 0, 0, 0)->lastOfQuarter(); // 2014-06-30 00:00:00
Carbon::create(2014, 5, 30, 0, 0, 0)->lastOfQuarter(Carbon::TUESDAY); // 2014-06-24 00:00:00
Carbon::create(2014, 5, 30, 0, 0, 0)->nthOfQuarter(2, Carbon::SATURDAY); // 2014-04-12 00:00:00
Carbon::create(2014, 5, 30, 0, 0, 0)->startOfQuarter(); // 2014-04-01 00:00:00
Carbon::create(2014, 5, 30, 0, 0, 0)->endOfQuarter(); // 2014-06-30 23:59:59

Carbon::create(2014, 5, 30, 0, 0, 0)->firstOfYear(); // 2014-01-01 00:00:00 年操作
Carbon::create(2014, 5, 30, 0, 0, 0)->firstOfYear(Carbon::MONDAY);// 2014-01-06 00:00:00
Carbon::create(2014, 5, 30, 0, 0, 0)->lastOfYear();  // 2014-12-31 00:00:00
Carbon::create(2014, 5, 30, 0, 0, 0)->lastOfYear(Carbon::TUESDAY); // 2014-12-30 00:00:00
Carbon::create(2014, 5, 30, 0, 0, 0)->nthOfYear(2, Carbon::SATURDAY);// 2014-01-11 00:00:00

Carbon::create(2018, 2, 23, 0, 0, 0)->nextWeekday(); // 2018-02-26 00:00:00 工作日操作
Carbon::create(2018, 2, 23, 0, 0, 0)->previousWeekday(); // 2018-02-22 00:00:00
Carbon::create(2018, 2, 21, 0, 0, 0)->nextWeekendDay(); // 2018-02-24 00:00:00
Carbon::create(2018, 2, 21, 0, 0, 0)->previousWeekendDay(); // 2018-02-18 00:00:00

// 取整操作
$dt = new Carbon('2012-01-31 15:32:45.654321');
$dt->roundMillisecond()->format('H:i:s.u');  // 15:32:45.654000
$dt->roundSecond()->format('H:i:s.u'); // 15:32:46.000000
$dt->floorSecond()->format('H:i:s.u'); // 15:32:45.000000
$dt->roundMinute()->format('H:i:s'); // 15:32:00
$dt->ceilMinute()->format('H:i:s'); // 15:33:00
$dt->roundMinute(10)->format('H:i:s'); // 15:30:00
$dt->round()->format('H:i:s.u');              // 15:32:46.000000
$dt->floor()->format('H:i:s.u');              // 15:32:45.000000
$dt->ceil()->format('H:i:s.u');               // 15:32:46.000000
$dt = new Carbon('2012-01-31');
$dt->roundUnit('month', 2)->format('Y-m-d');  // 2012-01-01
$dt = new Carbon('2012-01-31');
$dt->floorUnit('month')->format('Y-m-d');     // 2012-01-01
$dt = new Carbon('2012-01-31');
$dt->ceilUnit('month', 4)->format('Y-m-d');   // 2012-05-01

常量

Carbon::SUNDAY; // int(0)
Carbon::MONDAY; // int(1)
Carbon::TUESDAY; // int(2)
Carbon::WEDNESDAY; // int(3)
Carbon::THURSDAY; // int(4)
Carbon::FRIDAY; // int(5)
Carbon::SATURDAY; // int(6)
Carbon::YEARS_PER_CENTURY; // int(100)
Carbon::YEARS_PER_DECADE; // int(10)
Carbon::MONTHS_PER_YEAR; // int(12)
Carbon::WEEKS_PER_YEAR; // int(52)
Carbon::DAYS_PER_WEEK; // int(7)
Carbon::HOURS_PER_DAY; // int(24)
Carbon::MINUTES_PER_HOUR; // int(60)
Carbon::SECONDS_PER_MINUTE; // int(60)

系列化

$dt = Carbon::create(2012, 12, 25, 20, 30, 00, 'Europe/Moscow');
serialize($dt); // O:13:"Carbon\Carbon":3:{s:4:"date";s:26:"2012-12-25 20:30:00.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:13:"Europe/Moscow";}
$dt->serialize(); // O:13:"Carbon\Carbon":3:{s:4:"date";s:26:"2012-12-25 20:30:00.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:13:"Europe/Moscow";}
$dt = 'O:13:"Carbon\Carbon":3:{s:4:"date";s:26:"2012-12-25 20:30:00.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:13:"Europe/Moscow";}';
unserialize($dt)->format('Y-m-d\TH:i:s.uP T'); // 2012-12-25T20:30:00.000000+04:00 MSK
Carbon::fromSerialized($dt)->format('Y-m-d\TH:i:s.uP T'); // 2012-12-25T20:30:00.000000+04:00 MSK

JSON

$dt = Carbon::create(2012, 12, 25, 20, 30, 00, 'Europe/Moscow');
json_encode($dt); // "2012-12-25T16:30:00.000000Z"
$json = '{"date":"2012-12-25 20:30:00.000000","timezone_type":3,"timezone":"Europe\/Moscow"}';
$dt = Carbon::__set_state(json_decode($json, true));
$dt->format('Y-m-d\TH:i:s.uP T'); // 2012-12-25T20:30:00.000000+04:00 MSK
$dt = Carbon::create(2012, 12, 25, 20, 30, 00, 'Europe/Moscow');
json_encode($dt); // "2012-12-25T16:30:00.000000Z"
$json = '{"date":"2012-12-25 20:30:00.000000","timezone_type":3,"timezone":"Europe\/Moscow"}';
$dt = Carbon::__set_state(json_decode($json, true));
$dt->format('Y-m-d\TH:i:s.uP T'); // 2012-12-25T20:30:00.000000+04:00 MSK

CarbonInterval 时间间隔

// 实例化
CarbonInterval::createFromFormat('H:i:s', '10:20:00'); // 10 hours 20 minutes
CarbonInterval::year(); // 1 year
CarbonInterval::months(3); // 3 months
CarbonInterval::days(3)->addSeconds(32); // 3 days 32 seconds
CarbonInterval::weeks(3); // 3 weeks
CarbonInterval::days(23); // 3 weeks 2 days
CarbonInterval::create(2, 0, 5, 1, 1, 2, 7, 123); // 2 years 5 weeks 1 day 1 hour 2 minutes 7 seconds
CarbonInterval::createFromDateString('3 months'); // 3 months
CarbonInterval::fromString('2 minutes 15 seconds');

// 调整间隔
$interval = CarbonInterval::months(3); // 3 months
$interval->subMonths(1); // 2 months
$interval->addDays(15); // 2 months 2 weeks 1 day
$interval = CarbonInterval::months(3); // 3 months
$interval->minus(months: 1); // 2 months
$interval->plus(days: 15, hours: 20); // 2 months 2 weeks 1 day 20 hours

// DateInterval 转 CarbonInterval$di = new \DateInterval('P1Y2M'); // 内置时间间隔类
$ci = CarbonInterval::instance($di); //  // 1 year 2 months Carbon\CarbonInterval
// CarbonInterval 转 DateInterval$ci = CarbonInterval::days(2);
$di = $ci->toDateInterval(); //DateInterval

// 显示
$dateInterval = new DateInterval('P2D');
$carbonInterval = CarbonInterval::month();
CarbonInterval::make($dateInterval)->locale('zh')->forHumans(); // 2天
CarbonInterval::make($carbonInterval)->locale('zh')->forHumans(); // 1个月
CarbonInterval::make(5, 'days')->locale('zh')->forHumans(); // 5天
CarbonInterval::make('PT3H')->locale('zh')->forHumans(); // 3小时
CarbonInterval::make('1h 15m')->locale('zh')->forHumans(); // 1小时15分钟
CarbonInterval::make('1h 15m')->locale('zh')->forHumans(['short' => true]); // 1小时15分钟

CarbonPeriod

// 以下用法功能一致  2018-04-21 到 2018-04-27 每三天一个间隔
$period = new CarbonPeriod('2018-04-21', '3 days', '2018-04-27');
$period = CarbonPeriod::create('2018-04-21', '3 days', '2018-04-27');
$period = CarbonPeriod::since('2018-04-21')->days(3)->until('2018-04-27');
$period = CarbonInterval::days(3)->toPeriod('2018-04-21', '2018-04-27');
$period = Carbon::parse('2018-04-21')->toPeriod('2018-04-27', '3 days'); // pass end and interval
$period = Carbon::parse('2018-04-21')->toPeriod('2018-04-27', 3, 'days');
$period = Carbon::parse('2018-04-21')->range('2018-04-27', 3, 'days'); // Carbon::range is an alias of Carbon::toPeriod
$period = Carbon::parse('2018-04-21')->daysUntil('2018-04-27', 3);


$period = Carbon::parse('2018-04-21')->daysUntil('2018-04-27'); // 等同于 CarbonPeriod::create('2018-04-21', '1 day', '2018-04-27')
/*
microsUntil() or microsecondsUntil() 同上
millisUntil() or millisecondsUntil() 同上
secondsUntil() 同上
minutesUntil() 同上
hoursUntil() 同上
weeksUntil() 同上
monthsUntil() 同上
quartersUntil() 同上
yearsUntil() 同上
decadesUntil() 同上
centuriesUntil() 同上
millenniaUntil() 同上
*/
// Using number of recurrences:
CarbonPeriod::create('now', '1 day', 3); // 今天 明天 后天

CarbonTimeZone

总结

如果你看到这里,我这边建议, 还是用官方内置的类吧

  • DateInterval
  • DatePeriod
  • DateTime
  • DateTimeImmutable
  • DateTimeInterface
  • DateTimeZone

这组件太大太多东西太繁琐了,如果不是频繁操作时间导入这个大的组件简直得不偿失

本作品采用《CC 协议》,转载必须注明作者和本文链接
遇强则强,太强另说
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!