PHP转Go系列 | Carbon 时间处理工具的使用姿势

开发 前端
时间处理无论是哪一门编程语言都是绕不过的一个话题,我们经常做 PHP 开发的程序员,要想比较顺利的学习 Go 语言,最好的方式就是能找到同类型的第三方库,说白了就是找到熟悉且好用的轮子,因为人的心里总是对自己熟悉的东西感到兴奋,对不熟的东西感到恐惧。

大家好,我是码农先森。

在日常的开发过程中经常会遇到对时间的处理,比如将时间戳进行格式化、获取昨天或上周或上个月的时间、基于当前时间进行加减等场景的使用。

在 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
责任编辑:武晓燕 来源: 码农先森
相关推荐

2009-11-26 14:14:06

PHP中文处理工具函数

2023-02-24 07:48:20

PHPGo服务

2022-12-28 12:11:57

PHPGo框架

2022-07-19 08:01:55

函数Go格式化

2022-12-12 09:42:04

PHPGo框架

2021-07-12 11:35:13

Go协程Goroutine

2010-03-09 19:19:40

Python图像处理

2023-09-04 13:26:27

PHP开发工具

2009-12-10 14:27:21

PHP处理Word转P

2024-02-06 14:05:00

Go中间件框架

2024-10-21 09:06:15

2024-02-26 00:02:00

开发Go

2015-08-14 09:21:09

gdb工具调试 Go

2024-01-19 07:39:25

Go日期开发

2021-12-01 23:16:44

工具数据处理

2021-12-02 09:36:23

大数据工具数据分析

2020-07-22 08:13:22

大数据

2022-08-31 09:52:19

Python图像处理

2014-07-16 16:17:00

2015-07-13 11:32:09

PHP程序员正确姿势
点赞
收藏

51CTO技术栈公众号