日期及時間處理包 Carbon 在 Laravel 中的簡單使用
在編寫 PHP 應用時經常需要處理日期和時間,這篇文章帶你瞭解一下 Carbon – 繼承自 PHP DateTime 類的 API 擴充套件,它使得處理日期和時間更加簡單。Laravel 中預設使用的時間處理類就是 Carbon。
1 安裝
通過 Composer 來安裝 Carbon:
composer require nesbot/carbon
PS:由於 Laravel 專案已預設安裝了此包,所以不需要再次執行上面的命令。
2 使用
你需要通過名稱空間匯入 Carbon 來使用,而不需每次都提供完整的名稱。
use Carbon\Carbon;
2.1 獲取當前時間
可以同now()
方法獲取當前的日期和時間。如果你不指定引數,它會使用 PHP 配置中的時區:
<?php
echo Carbon::now(); //2016-10-14 20:21:20
?>
如果你想使用一個不同的時區,你需要傳遞一個有效的時區作為引數:
除 now()
外,還提供了today()
、tomorrow()
、yesterday()
等靜態函式,不過,它們的時間都是 00:00:00
:
echo Carbon::now(); // 2016-10-14 15:18:34
echo Carbon::today(); // 2016-10-14 00:00:00
echo Carbon::tomorrow('Europe/London'); // 2016-10-14 00:00:00
echo Carbon::yesterday(); // 2016-10-14 00:00:00
以上輸出結果其實是一個 Carbon 型別的日期時間物件:
Carbon {#179 ▼
+"date": "2016-06-14 00:00:00.000000"
+"timezone_type": 3
+"timezone": "UTC"
}
要想獲取字串型別的日期,可以使用下面的程式碼:
echo Carbon ::today()->toDateTimeString();
echo Carbon::yesterday()->toDateTimeString();
echo Carbon::tomorrow()->toDateTimeString();
2.2 日期型別轉為字串
如上所述,預設情況下,Carbon 的方法返回的為一個日期時間物件。雖然它是一個物件,但是你卻可以直接使用 echo 輸出結果,因為有 __toString
魔術方法。但是如果你想把它轉為字串,可以使用 toDateString
或 toDateTimeString
方法:
echo Carbon::now()->toDateString(); //2016-10-14
echo Carbon::now()->toDateTimeString(); //2016-10-14 20:22:50
2.3 日期解析
你還可以使用 parse
方法解析任何順序和型別的日期(結果為 Carbon 型別的日期時間物件):
echo Carbon::parse('2016-10-15')->toDateTimeString(); //2016-10-15 00:00:00
echo Carbon::parse('2016-10-15')->toDateTimeString(); //2016-10-15 00:00:00
echo Carbon::parse('2016-10-15 00:10:25')->toDateTimeString(); //2016-10-15 00:10:25
echo Carbon::parse('today')->toDateTimeString(); //2016-10-15 00:00:00
echo Carbon::parse('yesterday')->toDateTimeString(); //2016-10-14 00:00:00
echo Carbon::parse('tomorrow')->toDateTimeString(); //2016-10-16 00:00:00
echo Carbon::parse('2 days ago')->toDateTimeString(); //2016-10-13 20:49:53
echo Carbon::parse('+3 days')->toDateTimeString(); //2016-10-18 20:49:53
echo Carbon::parse('+2 weeks')->toDateTimeString(); //2016-10-29 20:49:53
echo Carbon::parse('+4 months')->toDateTimeString(); //2017-02-15 20:49:53
echo Carbon::parse('-1 year')->toDateTimeString(); //2015-10-15 20:49:53
echo Carbon::parse('next wednesday')->toDateTimeString(); //2016-10-19 00:00:00
echo Carbon::parse('last friday')->toDateTimeString(); //2016-10-14 00:00:00
2.4 構造日期
你還可以使用單獨的年月日來構造日期:
$year = '2015';
$month = '04';
$day = '12';
echo Carbon::createFromDate($year, $month, $day); //2015-04-12 20:55:59
$hour = '02';
$minute = '15':
$second = '30';
echo Carbon::create($year, $month, $day, $hour, $minute, $second); //2015-04-12 02:15:30
echo Carbon::createFromDate(null, 12, 25); // 年預設為當前年份
此外,還可以傳遞一個有效的時區作為最後一個引數。
2.5 日期操作
日期操作可以通過 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
2.6 日期比較
在 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!
2.7 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秒距現在
echo Carbon::now()->subDays(24)->diffForHumans(); // 3周前
echo Carbon::now()->subDays(24)->diffForHumans(null, true); // 3周
2.8 本地化
相關推薦
日期及時間處理包 Carbon 在 Laravel 中的簡單使用
在編寫 PHP 應用時經常需要處理日期和時間,這篇文章帶你瞭解一下 Carbon – 繼承自 PHP DateTime 類的 API 擴充套件,它使得處理日期和時間更加簡單。Laravel 中預設使用的時間處理類就是 Carbon。 1 安裝 通過 Co
laravel 日期與實踐處理包 Carbon
europe 當前時間 bho minute tom set months code mem //引入 use Carbon\Carbon; //使用 echo Carbon::now(); //2016-10-14 20:21:20 //獲取當前時間 // 直接使用
ios 開發中的日期和時間處理(轉)
NSDate儲存的是世界標準時(UTC),輸出時需要根據時區轉換為本地時間 Dates NSDate類提供了建立date,比較date以及計算兩個date之間間隔的功能。Date物件是不可改變的。 如果你要建立date物件並表示當前日期,你可以alloc一個NSDate物件並
ExtJs Js中常用的格式化及時間處理函式
以下示例顯示瞭如何在美國語言環境中解釋日期和時間模式。給定的日期和時間為美國太平洋時區的本地時間 2001-07-04 12:08:56。 日期和時間模式 結果 "yyyy.M
ActionScript中的日期和時間處理
日期和事件是在 ActionScript 程式中使用的一種常見的資訊型別。 Date類和 flash.utils 包中的新 Timer 類提供了大部分的計時功能。 常見日期和時間任務 處理 Date 物件; 獲取當前日期和時間; 訪問各個日期和時間單位;
[Python3]日期和時間處理
num import time模塊 now() sda 年份 -s 好的 等價 概述 在python中, date、time、datetime類提供了一系列處理日期、時間和時間間隔的函數。 在Python裏我們大致可以把其實現日期時間類分為5個: date僅用
常用日期、時間處理函數
技術分享 是否 pos color 日期轉換 var sele 月份 .sql --日期、時間截取DECLARE @dt DATETIME = GETDATE() SELECT @dt AS 原始日期, CAST(@
python 3 之日期與時間處理模塊(date和datetime)
python 時間 處理模塊 前言相關術語的解釋時間的表現形式time模塊datetime模塊時間格式碼總結前言 在開發工作中,我們經常需要用到日期與時間,如: 作為日誌信息的內容輸出計算某個功能的執行時間用日期命名一個日誌文件的名稱記錄或展示某文章的發布或修改時間其他Python中提供了多個用於
cmd命令獲取當前日期及時間
年月日周 C:\Users\Administrator>echo %date% 2018/11/20 週二 年 C:\Users\Administrator>echo %date:~0,
Python之日期與時間處理模組(date和datetime)
本節內容 前言 相關術語的解釋 時間的表現形式 time模組 datetime模組 時間格式碼 總結 前言 在開發工作中,我們經常需要用到日期與時間,如: 作為日誌資訊的內容輸出 計算某個功能的執行時間 用日期命名一個日誌檔案的名稱 記錄或展示某文章的釋出或修改
C語言例子(4)獲取當前日期及時間
#include<time.h> int main() { time_t timep; struct tm *p; time (&timep); p=gmtime(&timep); printf("%d/%d/%d\n",
python很好用的時間處理包 Arrow
py標準包datetime 中的時間處理,方法較繁多,不是很好記憶,所以在使用的便利程度上難免會打個折,然後發現一款很好用的python的時間處理包Arrow git上的專案地址 簡單的
mysql常用函式----日期和時間處理函式
對於每個型別擁有的值範圍以及並且指定日期何時間值的有效格式的描述見7.3.6 日期和時間型別。 這裡是一個使用日期函式的例子。下面的查詢選擇了所有記錄,其date_col的值是在最後30天以內: mysql> SELECT something FROM table
sqlite時間函式及時間處理
Sqlite3支援的資料型別 NULL:The value is a NULL value INTEGER:The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on th
python時間處理包:datetime,time
time包 time包基於C語言的庫函式(library functions)。Python的直譯器通常是用C編寫的,Python的一些函式也會直接呼叫C語言的庫函式。 import time print(time.time()) # wall clock time, unit: s
C語言獲取當前的日期及時間
我們在寫C語言程式的時候,有的時候會用到讀取本機的時間和日期,怎麼做呢?其實很簡單的,下面簡單說一下:C語言中讀取系統時間的函式為time(),其函式原型為:#include <time.h>time_t time( time_t * ) ;time_t就是lon
Laravel中簡單使用Repository模式
什麼是Repository模式,laravel學院中用這樣一張圖來解釋 其實將這個模式用在專案中就是為了將業務邏輯和具體的呼叫分開,建立一個倉庫來存放這些業務邏輯。那麼我們怎麼使用呢?
Python學習:時間處理工具--dateutil兩個簡單用法
想從Blog的RSS中讀取日誌內容,再根據日期來確定哪些內容是自己所需要的,這裡需要用到兩個東西,一個是不同格式日期的解析,一個就是日期的比較了。Google一翻後,找到了dateutil這個庫: 需要注意的是,如果自己的系統裡所用的是Python 3.0以下版本的話,
在Java 8中如何處理日期和時間
工廠方法 相同 例如 屬性。 ant arch java 去掉 靜態常量 常有人問我學習一個新庫的最好方式是什麽?我的答案是在實際項目中使用它。項目中有很多真正的需求驅使開發者去發掘並學習新庫。簡單得說就是任務驅動學習探 索。這對Java 8新日期時間API也不例外。我創建
Matlab中處理日期與時間的函數
html num 查看 格式 del 需要 log 但是 獲取 Matlab用三種格式來表示日期與時間(1)雙精度型日期數字:一個日期型數字代表從公元0年到某一日期的的天數,例如,2008年8月26日夜時0點鐘被表示為733646,而這同一天的中午12點就被表示為73364