日期及时间处理包 Carbon 的简单使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34804120/article/details/89736269

在编写 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:00

echo $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:00

echo $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:00

echo $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:00

echo $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:00

echo $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:00

echo $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:00

echo $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:00

echo $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:00

echo $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:00

echo $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:00

echo $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:00

echo $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/Vancouver

var_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 ago

echo 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 after

echo Carbon::now()->addSeconds(5)->diffForHumans();                      // in 4 seconds

echo Carbon::now()->subDays(24)->diffForHumans();                        // 3 weeks ago
echo Carbon::now()->subDays(24)->longAbsoluteDiffForHumans();            // 3 weeks

echo 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 after

echo 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手册

猜你喜欢

转载自blog.csdn.net/qq_34804120/article/details/89736269