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

news/2024/9/20 21:39:21/文章来源:https://www.cnblogs.com/yxhblogs/p/18272316

大家好,我是码农先森。

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

欢迎关注、分享、点赞、收藏、在看,我是微信公众号「码农先森」作者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/776002.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea设置了maven会自动变回C盘那个

IDE支持Maven包装器,IDEA会将其用于项目,如果不想从包装器中使用Maven。需要将项目中.mvn/wrapper/下的maven-wrapper.properties从项目中删除。 原文链接:https://blog.csdn.net/qq_45972323/article/details/138044146

不知道如何通过OPC文件传输管控,助力企业提高效率与竞争力?

OPC(Open Platform Communications)是一种用于工业自动化和控制系统中设备与软件之间数据交换的通信协议。以下是一些会涉及到OPC文件传输的行业: 工业自动化:用于实现设备、控制系统和软件之间的数据交换,提高生产效率和灵活性。 楼宇自控:用于设备控制和数据通信,确保…

canvas实现截图功能

开篇 最近在做一个图片截图的功能。 因为工作时间很紧张, 当时是使用的是一个截图插件。 周末两天无所事事,来写一个简单版本的截图功能。 因为写的比较简单,如果写的不好,求大佬轻一点喷读取图片并获取图片的宽度和高度思路 首先读取文件我们使用input中类型是file。 我们需…

BI 工具助力企业解锁数字化工厂,开启工业智能新视界

背景 在 2022 年公布的《“十四五”数字经济发展规划》中,政府不断增加对制造业数字化转型的政策支持力度,积极倡导制造企业采用最新技术,提升自动化、数字化和智能化水平。这一举措旨在强化国际竞争力,推动制造业由制造大国向制造强国转变。 然而,在制造业数字化和智能化…

接口依赖处理(Jemeter添加JSON提取器)

操作 1、在对应请求下添加JSON提取器 2、设置想要提取的参数的参数名以及路径 3、将提取到的参数值关联到其他接口 语法格式 1、提取路径格式:$(代表最外层的花括号).K.K 2、关联到其他接口:${K}

内网穿透公众号开本地nginx发环境配置(花生壳和量子互联)

昨天搞了一天,这儿总结一下,免得以后忘了 nginx收入80端口 所以穿透的工具局域网设80 其它端口根据软件应用配置 花生壳的通道要选https 量子互联的话tcp 配置启动https 就可以 nginx 我用1.24没有能成功 1.20成功了,不知道啥 原因 nginx配置时注意全文,都 …

测试采样率变化对音频的影响

SRC(Sample Rate Convert,采样率转换)是hifi发烧友老生常谈的一个问题。为了让多个来源的音频可以同时输出给设备,操作系统会将全部的音频转换为同一采样率,比如Android设备会将音频采样率统一转换为48kHz。这篇文章测试了不同安卓设备和版本之间的音频重采样:2021年Andr…

推荐一款基于人工智能驱动的无代码自动化测试平台!

今天给大家推荐一款基于人工智能驱动的无代码自动化测试平台:testRigor! 1、testRigor介绍 简单来说,testRigor是一款基于人工智能驱动的无代码自动化测试平台,它能够通过分析应用的行为模式,智能地生成测试用例,并自动执行这些测试,无需人工编写测试脚本。可以用于Web、…

获取安卓中加密数据库的密钥

带大家过一遍如何分析常见java层的数据库加密密钥确定数据库是否加密,找到数据库路径,对于有度这个样本,其数据库位于/data/data/im.xinda.youdu/files/youdu/db/路径下,该路径会存在1个或多个文件夹,用于存储不同用户的数据,其格式为buin_用户uin_user_用户gid,其中uin…

C#/.NET/.NET Core优秀项目和框架2024年7月简报

前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项…

Linux 端口排查小结

检查网络端口排查思路:首先进行ping测试,如果ping测试不同检查ICMP协议是否开通和防火墙设置。 如果ping测试通的话 3.telnet ip 端口 ,检查是否可以测通,如果测不通,首先进入服务器检查监听端口和对应开放的IP: netstat -tunlp |grep 224、如果还不通 检查防火墙 和 i…

破案了

看来以后发犇犇要小心点了,不然就被学弟翻到了😰