在编写 PHP 应用时经常需要处理日期和时间,这篇文章带你了解一下 Carbon – 继承自 PHP DateTime 类的 API 扩展,它使得处理日期和时间更加简单。

1. 通过composer安装

版本环境要求:
1.x is compatible with PHP 5.3+.
2.x version requires PHP 7.1.8+.

composer require nesbot/carbon
{"require": {"nesbot/carbon": "^2.16"}
}

2.使用

<?php
require 'vendor/autoload.php';use Carbon\Carbon;printf("Now: %s", Carbon::now());

2.1获取当前时间

echo Carbon::now();
echo Carbon::today();
echo  Carbon::tomorrow();
echo Carbon::yesterday();
//today()、tomorrow()、yesterday()等静态函数,它们的时间都是 00:00:00

输出结果

Carbon @1556674336 {#343 ▼date: 2019-05-01 09:32:16.169639 Asia/Hong_Kong (+08:00)
}

2.2 日期类型转为字符串

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

echo Carbon::now()->toDateString();           //2019-05-01
echo Carbon::now()->toDateTimeString();  //2019-05-01 09:32:16

2.3日期解析

你还可以使用 parse方法解析任何顺序和类型的日期
Carbon::parse($time, $tz) 第一个参数指转换的时间,第二个参数为时区

$time可选的相对修饰符的单词列表是:

+
-
ago
first
next
last
this
today
tomorrow
yesterday
$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();                                  // always clear it !

请注意,类似于next(),previous()和modify()方法,其中一些相对修饰符会将时间设置为00:00:00。

2.4 构造日期

$year = 2000; $month = 4; $day = 19;
$hour = 20; $minute = 30; $second = 15; $tz = 'Asia/Hong_Kong';
echo Carbon::createFromDate($year, $month, $day, $tz)."\n";   //2000-04-19 10:18:22
echo Carbon::createFromTime($hour, $minute, $second, $tz)."\n";   //2019-05-01 20:30:15
echo Carbon::create($year, $month, $day, $hour, $minute, $second, $tz)."\n";  //2000-04-19 20:30:15

createFromDate()将默认时间到现在。createFromTime()将日期默认为今天

2.5日期操作

默认的DateTime提供了几种不同的方法,可以轻松地添加和减去时间。 有modify(),add()和sub()

$dt = Carbon::create(2012, 1, 31, 0);echo $dt->toDateTimeString();            // 2012-01-31 00:00:00echo $dt->addCenturies(5);               // 2512-01-31 00:00:00
echo $dt->addCentury();                  // 2612-01-31 00:00:00
echo $dt->subCentury();                  // 2512-01-31 00:00:00
echo $dt->subCenturies(5);               // 2012-01-31 00:00:00echo $dt->addYears(5);                   // 2017-01-31 00:00:00
echo $dt->addYear();                     // 2018-01-31 00:00:00
echo $dt->subYear();                     // 2017-01-31 00:00:00
echo $dt->subYears(5);                   // 2012-01-31 00:00:00echo $dt->addQuarters(2);                // 2012-07-31 00:00:00
echo $dt->addQuarter();                  // 2012-10-31 00:00:00
echo $dt->subQuarter();                  // 2012-07-31 00:00:00
echo $dt->subQuarters(2);                // 2012-01-31 00:00:00echo $dt->addMonths(60);                 // 2017-01-31 00:00:00
echo $dt->addMonth();                    // 2017-03-03 00:00:00
echo $dt->subMonth();                    // 2017-02-03 00:00:00
echo $dt->subMonths(60);                 // 2012-02-03 00:00:00echo $dt->addDays(29);                   // 2012-03-03 00:00:00
echo $dt->addDay();                      // 2012-03-04 00:00:00
echo $dt->subDay();                      // 2012-03-03 00:00:00
echo $dt->subDays(29);                   // 2012-02-03 00:00:00echo $dt->addWeekdays(4);                // 2012-02-09 00:00:00
echo $dt->addWeekday();                  // 2012-02-10 00:00:00
echo $dt->subWeekday();                  // 2012-02-09 00:00:00
echo $dt->subWeekdays(4);                // 2012-02-03 00:00:00echo $dt->addWeeks(3);                   // 2012-02-24 00:00:00
echo $dt->addWeek();                     // 2012-03-02 00:00:00
echo $dt->subWeek();                     // 2012-02-24 00:00:00
echo $dt->subWeeks(3);                   // 2012-02-03 00:00:00echo $dt->addHours(24);                  // 2012-02-04 00:00:00
echo $dt->addHour();                     // 2012-02-04 01:00:00
echo $dt->subHour();                     // 2012-02-04 00:00:00
echo $dt->subHours(24);                  // 2012-02-03 00:00:00echo $dt->addMinutes(61);                // 2012-02-03 01:01:00
echo $dt->addMinute();                   // 2012-02-03 01:02:00
echo $dt->subMinute();                   // 2012-02-03 01:01:00
echo $dt->subMinutes(61);                // 2012-02-03 00:00:00echo $dt->addSeconds(61);                // 2012-02-03 00:01:01
echo $dt->addSecond();                   // 2012-02-03 00:01:02
echo $dt->subSecond();                   // 2012-02-03 00:01:01
echo $dt->subSeconds(61);                // 2012-02-03 00:00:00echo $dt->addMilliseconds(61);           // 2012-02-03 00:00:00
echo $dt->addMillisecond();              // 2012-02-03 00:00:00
echo $dt->subMillisecond();              // 2012-02-03 00:00:00
echo $dt->subMillisecond(61);            // 2012-02-03 00:00:00echo $dt->addMicroseconds(61);           // 2012-02-03 00:00:00
echo $dt->addMicrosecond();              // 2012-02-03 00:00:00
echo $dt->subMicrosecond();              // 2012-02-03 00:00:00
echo $dt->subMicroseconds(61);           // 2012-02-03 00:00:00// and so on for any unit: millenium, century, decade, year,
//quarter, month, week, day, weekday, hour, minute, second, microsecond.//依此类推任何单位:千禧年,世纪,十年,年,
//季,月,周,日,工作日,小时,分钟,秒,微秒。

3.Carbon在Laravel中的使用

Laravel 中默认使用的时间处理类就是 Carbon。
Laravel 项目已默认安装了nesbot/carbon包。

2.6日期比较

通过以下功能提供简单的比较。请记住,比较是在UTC时区完成的,所以事情并不总是如此。

  • min –返回最小日期。
  • max – 返回最大日期。
  • eq – 判断两个日期是否相等。
  • gt – 判断第一个日期是否比第二个日期大。
  • lt – 判断第一个日期是否比第二个日期小。
  • gte – 判断第一个日期是否大于等于第二个日期。
  • lte – 判断第一个日期是否小于等于第二个日期。
$first = Carbon::create(2012, 9, 5, 23, 26, 11,'UTC');
$second = Carbon::create(2012, 9, 5, 20, 26, 11, 'America/Vancouver');echo $first->toDateTimeString();                   // 2012-09-05 23:26:11
echo $first->tzName;                               // UTC
echo $second->toDateTimeString();                  // 2012-09-05 20:26:11
echo $second->tzName;                              // America/Vancouvervar_dump($first->eq($second));                     // bool(true)
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)

要确定当前实例是否在两个其他实例之间,您可以使用恰当命名的between()方法(或isBetween()别名)。 第三个参数表示是否应该进行等于比较。 默认值为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)
var_dump(Carbon::create(2012, 9, 5, 5)->isBetween($first, $second, false)); // bool(false)

2.7 Difference for Humans

参考文档:https://carbon.nesbot.com/docs/#api-humandiff

1 month ago与30天前相比,人类更容易阅读。这是在大多数日期库中看到的常见功能,所以我想我也会在这里添加它。该函数的唯一参数是要比对的另一个Carbon实例,当然now()如果未指定则默认为。

此方法将在相对于实例和传入实例的差值之后添加一个短语。有4种可能性:

将过去的值与默认值进行比较时:

  • 1小时前
  • 5个月前

将未来的值与默认值进行比较时:

  • 从现在起1小时
  • 从现在起5个月

将过去的值与另一个值进行比较时:

  • 1小时前
  • 5个月前

将未来的值与另一个值进行比较时:

  • 1小时后
  • 5个月后
// The most typical usage is for comments
// The instance is the date the comment was created and its being compared to default now()
echo Carbon::now()->subDays(5)->diffForHumans();               // 5 days agoecho Carbon::now()->diffForHumans(Carbon::now()->subYear());   // 11 months after$dt = Carbon::createFromDate(2011, 8, 1);echo $dt->diffForHumans($dt->copy()->addMonth());                        // 1 month before
echo $dt->diffForHumans($dt->copy()->subMonth());                        // 1 month afterecho Carbon::now()->addSeconds(5)->diffForHumans();                      // in 4 secondsecho Carbon::now()->subDays(24)->diffForHumans();                        // 3 weeks ago
echo Carbon::now()->subDays(24)->longAbsoluteDiffForHumans();            // 3 weeksecho Carbon::parse('2019-08-03')->diffForHumans('2019-08-13');           // 1 week before
echo Carbon::parse('2000-01-01 00:50:32')->diffForHumans('@946684800');  // 50 minutes afterecho Carbon::create(2018, 2, 26, 4, 29, 43)->longRelativeDiffForHumans(Carbon::create(2016, 6, 21, 0, 0, 0), 6);
// 1 year 8 months 5 days 4 hours 29 minutes 43 seconds after

3.1Laravel本地化

Laravel 中默认使用的时间处理类就是 Carbon
可以在 app/Providers/AppServiceProvider.phpboot() 方法中添加下面的代码来设置全局本地化:

public function boot()
{\Carbon\Carbon::setLocale('zh');
}

更多用法请参考文档:Carbon手册

日期及时间处理包 Carbon 的简单使用相关推荐

  1. php carbon 连续日期,日期及时间处理包 Carbon 在 Laravel 中的简单使用

    在编写 PHP 应用时经常需要处理日期和时间,这篇文章带你了解一下 Carbon – 继承自 PHP DateTime 类的 API 扩展,它使得处理日期和时间更加简单.Laravel 中默认使用的时 ...

  2. Laravel 日期时间处理包 Carbon 的应用

    在编写 PHP 应用时经常需要处理日期和时间,这篇文章带你了解一下 Carbon – 继承自 PHP DateTime 类的 API 扩展,它使得处理日期和时间更加简单.Laravel 中默认使用的时 ...

  3. 【小家java】java8新特性之---全新的日期、时间API(JSR 310规范),附SpringMVC、Mybatis中使用JSR310的正确姿势

    [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小家java ...

  4. Python实战之数字、日期和时间的高级处理

    写在前面 博文为<Python Cookbook>读书后笔记整理 涉及内容包括: 浮点数执行指定精度的舍入运算. 执行精确的浮点数运算 数字的格式化输出 对数值进行取整 二进制.八进制和十 ...

  5. Java日期与时间API(详解全部新与旧API,含代码例子)

    目录 前言必读 二.新与旧API 新的API: 旧的API: 初步使用大全(SimpleDateFormat) 三.代码例子 1.获取当前时间 2.字符串转化为时间 四.新的API 1.LocalDa ...

  6. Python:日期和时间包datetime的用法

    1. 基本定义 1.1 时间戳   时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数(或总毫秒数).网上有很多时间戳在 ...

  7. R语言使用lubridate包的tz函数设置和查询日期、时间对象的时区信息( time zone)

    R语言使用lubridate包的tz函数设置和查询日期.时间对象的时区信息( time zone) 目录

  8. Python圆面积的计算、简单的人名对话、同切圆的绘制、日期和时间的输出。

    圆面积的计算.根据圆的半径计算圆的面积. 代码如下: #1.1 CalCirArea.py radius = 25 area = 3.1415 * radius * radius print(area ...

  9. 13-19 Python Number、Python字符串、Python列表(List)、集合的基本操作、元组、字典Dicttionnary、日期和时间

    13 Python Number Python Number数据类型用于存储数值. 数据类型是不允许改变的,这就是意味着如果改变Number数据类型的值,将重新分配内存空间. 以下实例在变量赋值时Nu ...

最新文章

  1. window 杀死已开任务启命令
  2. arima模型 p q d 确定_基于ARIMA预测股指期货价格走势
  3. pytorch 模型可视化_PyTorch Tips(FLOPs计算/参数量/计算图可视化/相关性分析)
  4. 加载如下html 写出输出顺序,浏览器加载和渲染html的顺序-结论篇
  5. 依赖注入及AOP简述(五)——依赖注入的方式 .
  6. maven 整体打包_Spirng boot maven多模块打包不踩坑(示例代码)
  7. Git 版本管理工具命令速查
  8. php 类的实现 完整例子
  9. tomcat给android发图片,一步一步学会http获取tomcat服务端的图片,在android客户端显示...
  10. jupyter notebook 中添加 Julia kernel
  11. [论文翻译] Active Learning by Feature Mixing
  12. python程序设计课后答案第二版_智慧职教APPPython程序设计(深圳信息职业技术学院)课后答案...
  13. Oracle:lsnrctl start Timeout or Adapter error
  14. 常量、变量;基本数据类型;input()、if、while、break、continue
  15. 如何设置Word自动检查语法错误
  16. android 9.0极光推送闪退,推送导致应用闪退
  17. 通过 iptables 禁止 ping
  18. FCC Lifeline项目现已帮助美国低收入家庭接入高速互联网
  19. caffe 人脸识别
  20. Oracle基本函数-大小写转换函数

热门文章

  1. 真正的员工激励如何做?并不是画大饼
  2. 一休哥的PowerBI学习之路-可控的视觉筛选器
  3. wifi信号增强android,WiFi信号增强放大器app下载
  4. Navicat 连接linux mysql 失败解决方法
  5. 浙江大学计算机科学基础题目,浙江大学计算机科学基础试题库精选
  6. 神经网络常用激活函数及其应用举例
  7. woff字体-xml-python根据坐标画字
  8. JVM第四篇之益处、常用java工具
  9. MySQL安装报错.NetFrameword安装未成功
  10. 一文带你了解 JavaScript 函数式编程