大家好,我是碼農先森。
在日常的開發過程中經常會遇到對時間的處理,比如將時間戳進行格式化、獲取昨天或上週或上個月的時間、基於當前時間進行加減等場景的使用。在 PHP 語言中有一個針對時間處理的原生函式 strtotime,大家都知道這個函式只能滿足基本的使用,如果遇到比較複雜的場景,則處理起來會比較繁瑣。PHP 作為世界上最好的語言,在這個問題面前自然會有大佬出來造輪子,由此就出現了 nesbot/carbon 擴充套件包。其實在 Go 語言中也有同樣功能的第三方庫 carbon,我看過介紹文件後,驚呼到簡直和 PHP 的擴充套件包長的一摸一樣,看樣子這位 Go 大佬也是從 PHP 轉過去的。這樣的好事直接降低了我們的學習成本,讓我們更加容易上手。
在 php_carbon 目錄下中使用 composer 命令安裝 carbon 包。
[manongsen@root ~]$ pwd
/home/manongsen/workspace/php_to_go/php_carbon
[manongsen@root php_carbon]$ composer require nesbot/carbon
在 go_carbon 目錄下中使用 go mod init
初始化 Go 專案,並且使用 go get
安裝 carbon 庫 。
[manongsen@root ~]$ pwd
/home/manongsen/workspace/php_to_go/go_carbon
[manongsen@root go_carbon]$ go mod init go_carbon
[manongsen@root go_carbon]$ go get github.com/golang-module/carbon/v2
這是初始化完成後的專案結構。
[manongsen@root php_to_go]$ tree -L 2
.
├── README.md
├── go_carbon
│ ├── go.mod
│ ├── go.sum
│ └── main.go
└── php_carbon
├── composer.json
├── composer.lock
├── index.php
└── vendor
我們先在 PHP 指令碼程式碼的首行透過函式 date_default_timezone_set 設定時區,再使用 require 載入依賴包。從下面示例程式碼中可以看出 Carbon 工具的用法還是比較便捷,比如使用 subDays 和 addDays 函式可以加減天數、使用 diffForHumans 函式能以符合人閱讀習慣的方式輸出等。此外,還有一些例子中沒有展示的用法,例如獲取當前的季節、獲取本週開始結束時間、時間差的計算、判斷當前的月份、獲取當前是本週的第幾天等等,從官方提供的文件來看 Carbon 工具用法還是相當的豐富,幾乎可以滿足任意業務場景的使用。
<?php
date_default_timezone_set("Asia/Shanghai");
require 'vendor/autoload.php';
use Carbon\Carbon;
// 獲取當前時間
$now = Carbon::now();
print_r("當前時間 " . $now->toDateTimeString() . "\n");
// 獲取今天時間
$today = Carbon::today();
print_r("今天時間 " . $today->toDateString() . "\n");
// 獲取昨天時間
$yesterday = Carbon::yesterday();
print_r("昨天時間 " . $yesterday->toDateString() . "\n");
// 獲取明天時間
$tomorrow = Carbon::tomorrow();
print_r("明天時間 " . $tomorrow->toDateString() . "\n");
// 3 天前時間
$threeDaysAgo = Carbon::today()->subDays(3);
print_r("3天前時間 " . $threeDaysAgo->toDateString(). "\n");
// 7 天前時間
$sevenDaysAgo = Carbon::today()->subDays(7);
print_r("7天前時間 " . $sevenDaysAgo->toDateString(). "\n");
// 符合人閱讀習慣的時間輸出
Carbon::setLocale('zh');
// 1個小時前
$anHourAgo = Carbon::now()->subHours(1)->diffForHumans();
print_r($anHourAgo. "\n");
// 1天前
$oneDayAgo = Carbon::now()->subDays(1)->diffForHumans();
print_r($oneDayAgo. "\n");
// 1個月前
$oneMonthAgo = Carbon::now()->subMonth()->diffForHumans();
print_r($oneMonthAgo. "\n");
執行 php index.php
命令便可輸出上述示例程式碼的結果。
[manongsen@root php_carbon]$ php index.php
當前時間 2024-06-27 22:23:11
今天時間 2024-06-27
昨天時間 2024-06-26
明天時間 2024-06-28
3天前時間 2024-06-24
7天前時間 2024-06-20
1小時前
1天前
1個月前
同樣在 Go 中的使用方式與 PHP 類似,但包的匯入是用 import 關鍵詞。如果原來對 PHP 的 Carbon 工具使用很熟練的話,那麼轉到 Go 來也會很容易理解,說是零門檻的學習成本也不為過。
package main
import (
"fmt"
"gitee.com/golang-module/carbon/v2"
)
func main() {
// 當前時間
now := carbon.Now().String()
fmt.Printf("當前時間 %v\n", now)
// 獲取今天時間
today := carbon.Now().ToDateString()
fmt.Printf("今天時間 %v\n", today)
// 獲取昨天時間
yesterday := carbon.Yesterday().ToDateString()
fmt.Printf("昨天時間 %v\n", yesterday)
// 獲取明天時間
tomorrow := carbon.Tomorrow().ToDateString()
fmt.Printf("明天時間 %v\n", tomorrow)
// 3天前時間
threeDaysAgo := carbon.Now().SubDays(3).ToDateString()
fmt.Printf("3天前時間 %v\n", threeDaysAgo)
// 7天前時間
sevenDaysAgo := carbon.Now().SubDays(7).ToDateString()
fmt.Printf("7天前時間 %v\n", sevenDaysAgo)
// 對人類友好的可讀格式時間格式
lang := carbon.NewLanguage()
lang.SetLocale("zh-CN")
c := carbon.SetLanguage(lang)
if c.Error != nil {
// 錯誤處理
fmt.Printf("err: %v\n", c.Error)
return
}
// 1個小時前
anHourAgo := c.Now().SubHours(1).DiffForHumans()
fmt.Printf("%v\n", anHourAgo)
// 1天前
oneDayAgo := c.Now().SubDays(1).DiffForHumans()
fmt.Printf("%v\n", oneDayAgo)
// 1個月前
oneMonthAgo := c.Now().SubMonths(1).DiffForHumans()
fmt.Printf("%v\n", oneMonthAgo)
}
執行 go run main.go
命令便可輸出上述示例程式碼的結果。從輸出的結果來看,與 PHP 輸出是一樣的並無差異。
[manongsen@root go_carbon]$ go run main.go
當前時間 2024-06-27 21:25:29
今天時間 2024-06-27
昨天時間 2024-06-26
明天時間 2024-06-28
3天前時間 2024-06-24
7天前時間 2024-06-20
1 小時前
1 天前
1 個月前
時間處理無論是哪一門程式語言都是繞不過的一個話題,我們經常做 PHP 開發的程式設計師,要想比較順利的學習 Go 語言,最好的方式就是能找到同型別的第三方庫,說白了就是找到熟悉且好用的輪子,因為人的心裡總是對自己熟悉的東西感到興奮,對不熟的東西感到恐懼。因此熟悉的東西可以減低我們的學習難度,提振我們學習的自信心。從上面的兩個程式碼示例來看,Go 語言的學習難度也不過如此,同時也打破了很多人說 Go 很難學的說法。最後為了方便大家學習 Carbon 時間處理工具,我把 PHP 中的 nesbot/carbon
和 Go 中的 golang-module/carbon/v2
官方文件附上。
- https://carbon.nesbot.com/
- https://github.com/golang-module/carbon/blob/master/README.cn.md
歡迎關注、分享、點贊、收藏、在看,我是微信公眾號「碼農先森」作者。