在 PHP 中使用日期和時間並不是容易或清晰的任務。我們必須處理 strtotime
,格式化問題,大量計算等等。
這個漂亮的包叫做 Carbon 可以幫助在 PHP 開發中處理日期/時間變得更加簡單、更語義化,從而使得我們的程式碼更容易閱讀和維護。
Carbon
Carbon 是由 Brian Nesbit 開發的一個包,它擴充套件了 PHP 自己的 DateTime 類。
它提供了一些很好的功能來處理 PHP 中的日期,特別是諸如:
- 處理時區
- 輕鬆獲取當前時間
- 將 datetime 轉換成可讀的內容
- 將英語短語解析成 datetime (first day of January 2016)
- 日期的加減 (+ 2 weeks, -6 months)
- 處理日期的語義方法
所有的這些都帶來了一個非常有用的包,使得這些在 PHP 中處理時間非常容易。
設定
為了使用 Carbon ,你需要從 Carbon
名稱空間中匯入 Carbon 。幸運的是,在 Laravel 中已經包括了 Carbon ,所以不需要和 Composer 一起新增。
當我們需要使用 Carbon 的時候,我們可以這樣匯入它:
<?php
use Carbon\Carbon;
複製程式碼
在匯入之後,讓我們看看我們可以用這個很棒的包做一些很酷的事情。
獲取特定的日期/時間
// 獲取當前時間 - 2015-12-19 10:10:54
$current = Carbon::now();
$current = new Carbon();
// 獲取今天 - 2015-12-19 00:00:00
$today = Carbon::today();
// 獲取昨天 - 2015-12-18 00:00:00
$yesterday = Carbon::yesterday();
// 獲取明天 - 2015-12-20 00:00:00
$tomorrow = Carbon::tomorrow();
// 解析特定字串 - 2016-01-01 00:00:00
$newYear = new Carbon('first day of January 2016');
// 設定一個特定的時區 - 2016-01-01 00:00:00
$newYearPST = new Carbon('first day of January 2016', 'America\Pacific');
複製程式碼
創造具有更細粒度控制的日期
除了快速定義日期/時間方法之外,Carbon 也可以讓我們從特定數量的引數中建立時間。
Carbon::createFromDate($year, $month, $day, $tz);
Carbon::createFromTime($hour, $minute, $second, $tz);
Carbon::create($year, $month, $day, $hour, $minute, $second, $tz);
複製程式碼
當你以一種通常不被 Carbon 識別的格式獲得某種日期或時間時,這些是非常有用的。如果你為任何一個引數傳遞 null
值,則它預設會使用當前日期/時間傳遞 。
操作日期/時間
抓取日期/時間並不是你在處理日期時唯一要做的事情。你經常需要操作日期或時間。
例如,當為一個使用者建立一個試用期時,你將希望試用期在一定時間後過期。假設我們有 30 天的試用期。我們可以用 add
和 subtract
很容易的計算出時間。
在這段試用期內,我們會:
// 獲取當前時間
$current = Carbon::now();
// 新增 30 天到當前時間
$trialExpires = $current->addDays(30);
複製程式碼
從 Carbon 文件 中,我們可以找到一些其他的 add()
和 sub()
方法:
$dt = Carbon::create(2012, 1, 31, 0);
echo $dt->toDateTimeString(); // 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->addMonths(60); // 2017-01-31 00:00:00
echo $dt->addMonth(); // 2017-03-03 00:00:00 equivalent of $dt->month($dt->month + 1); so it wraps
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
複製程式碼
Getters and Setters
另外一種快速操作或讀取時間的方法是使用可用的 getters 和 serrers 。
$dt = Carbon::now();
// 設定一些引數
$dt->year = 2015;
$dt->month = 04;
$dt->day = 21;
$dt->hour = 22;
$dt->minute = 32;
$dt->second = 5;
// 獲取一些引數
var_dump($dt->year);
var_dump($dt->month);
var_dump($dt->day);
var_dump($dt->hour);
var_dump($dt->second);
var_dump($dt->dayOfWeek);
var_dump($dt->dayOfYear);
var_dump($dt->weekOfMonth);
var_dump($dt->daysInMonth);
複製程式碼
我們甚至還可以把一些 setter 串在一起。
$dt = Carbon::now();
$dt->year(1975)->month(5)->day(21)->hour(22)->minute(32)->second(5)->toDateTimeString();
$dt->setDate(1975, 5, 21)->setTime(22, 32, 5)->toDateTimeString();
$dt->setDateTime(1975, 5, 21, 22, 32, 5)->toDateTimeString();
複製程式碼
格式化
在上面的示例中,你可能注意到了 ->toDateTimeString()
方法。我們可以方便的為達到我們的目的去進行格式化。在這種情況下,我們得到了一個日期時間字串。
$dt = Carbon::now();
echo $dt->toDateString(); // 2015-12-19
echo $dt->toFormattedDateString(); // Dec 19, 2015
echo $dt->toTimeString(); // 10:10:16
echo $dt->toDateTimeString(); // 2015-12-19 10:10:16
echo $dt->toDayDateTimeString(); // Sat, Dec 19, 2015 10:10 AM
// ……當然 format() 也可以這樣用
echo $dt->format('l jS \\of F Y h:i:s A'); // Saturday 19th of December 2015 10:10:16 AM
複製程式碼
相對時間
通過 diff()
方法可以很容易的顯示相對時間。
例如,我們有一篇部落格,並且我們想顯示它是在 三小時 前釋出的。可以利用這些方法。
求時間差
這些方法用於求兩個時間的時間差。
$current = Carbon::now();
$dt = Carbon::now();
$dt = $dt->subHours(6);
echo $dt->diffInHours($current); // -6
echo $current->diffInHours($dt); // 6
$future = $current->addMonth();
$past = $current->subMonths(2);
echo $current->diffInDays($future); // 31
echo $current->diffInDays($past); // -62
複製程式碼
顯示人類容易閱讀的時間差
在過去的幾年,顯示相對時間變得越來越流行。在 Twitter 和 Facebook 等社交網路中經常可以看到。
例如,將時間顯示為 3 小時前 比顯示 上午 8:12,更適合人類閱讀。
這些方法被用於計算時間差,並轉換為人類可閱讀的格式。
這裡有四種表達時間差的方式:
- 將一個過去的時間和現在做比較:
- 1 小時前
- 5 個月前
- 將一個未來的時間和現在做比較:
- 1 小時後
- 5 個月後
- 將一個過去的時間和另一個時間做比較:
- 1 小時前
- 5 小時前
- 將一個未來的時間和另一個做比較:
- 1 小時後
- 5 小時後
$dt = Carbon::now();
$past = $dt->subMonth();
$future = $dt->addMonth();
echo $dt->subDays(10)->diffForHumans(); // 10 天前
echo $dt->diffForHumans($past); // 1 個月前
echo $dt->diffForHumans($future); // 1 個月前
複製程式碼
總結
Carbon 能做的遠遠不止這些。請務必檢視 Carbon 官方文件。希望這能幫助你在 PHP 中更容易的使用日期 / 時間並加快開發效率!