PHP转Go系列 | Carbon 时间处理工具的使用姿势
大家好,我是码农先森。
在日常的开发过程中经常会遇到对时间的处理,比如将时间戳进行格式化、获取昨天或上周或上个月的时间、基于当前时间进行加减等场景的使用。在 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
官方文档附上。
欢迎关注、分享、点赞、收藏、在看,我是微信公众号「码农先森」作者。
PHP转Go系列 | Carbon 时间处理工具的使用姿势的更多相关文章
- JVM系列五:JVM监测&工具
JVM系列五:JVM监测&工具[整理中] http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...
- 前端工程化系列[04]-Grunt构建工具的使用进阶
在前端工程化系列[02]-Grunt构建工具的基本使用和前端工程化系列[03]-Grunt构建工具的运转机制这两篇文章中,我们对Grunt以及Grunt插件的使用已经有了初步的认识,并探讨了Grunt ...
- [java工具类01]__构建格式化输出日期和时间的工具类
在之前的学习中,我写过一篇关于字符串格式化的,就主要设计到了时间以及日期的各种格式化显示的设置,其主要时通过String类的fomat()方法实现的. 我们可以通过使用不同的转换符来实现格式化显示不同 ...
- ElasticSearch 2 (31) - 信息聚合系列之时间处理
ElasticSearch 2 (31) - 信息聚合系列之时间处理 摘要 如果说搜索是 Elasticsearch 里最受欢迎的功能,那么按时间创建直方图一定排在第二位.为什么需要使用时间直方图? ...
- 自定义View系列教程01--常用工具介绍
站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定 ...
- Map工具系列-04-SQL合并执行工具
所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...
- 封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类
快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------- ...
- DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension)
跟大家的交流是我的动力. :) DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★ ...
- 在项目管理中如何保持专注,分享一个轻量的时间管理工具【Flow Mac版 - 追踪你在Mac上的时间消耗】
在项目管理和团队作业中,经常面临的问题就是时间管理和优先级管理发生问题,项目被delay,团队工作延后,无法达到预期目标. 这个仿佛是每个人都会遇到的问题,特别是现在这么多的内容软件来分散我们的注意力 ...
- DAX/PowerBI系列 - 关于时间系列 - 时间相关数值比较 - 用非自带函数
DAX/PowerBI系列 - 关于时间系列 - 时间相关数值比较 - 用非自带函数 文末有彩蛋,解决蛋疼问题 难度: ★★☆☆☆(2星) 适用范围: ★★★☆☆(3星) 概况: 基于时间的汇总可能是 ...
随机推荐
- Qt内存回收机制
参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=16 Qt中内存的回收是自己完成的,实验中,我们自定义一个按钮,通过重写析构函数来观察现象. 新建 ...
- python-判断两个序列的成员是否一样
目的:判断两个序列的成员是否一样,如:list1 = [1, 2],list2 = [2, 1],则两个序列的成员是一样的. 实现:借助集合set()的性质实现. 代码如下: 1 if __name_ ...
- 2D 3D 景深 动画 阴影
2D 二维的平面空间,让元素在X轴或者Y轴进行变化 2D里面的功能函数 2D-位移 2D-旋转 2D-缩放 2D-倾斜 变形属性 transform:: 位移:transform:translate( ...
- mysql的varchar和oracle的varchar2比较
首先说结论: 1.mysql存储的是字符数(不分语言) 2.oracle存储的需要看定义,如果定义为varchar2(n),则默认是n个字节,如果是varchar2(n char)则是n个字节. 3. ...
- 在 VSCode 中编写 Markdown 的进阶指南
最新版的 Visual Studio Code 对 Markdown 的支持已显著提升,其在预览方面的体验甚至可以与 Markdown Preview Enhanced 插件相比.本文将介绍一些优化方 ...
- 用hive或mr清洗app数据
1.项目背景 从大量源数据中清洗出有效数据供后续程序使用. 源数据参照log.txt文件 2.项目源数据说明 9841EF7BDBDF0AC9AF42AEBB4E4F8D4F Id 12 状态1 22 ...
- 做一个单纯的react-image显示组件
最近项目上有一个需求,在显示图片的时候,需要传递自定义的头部就行认证.google了一番之后,发现没有现成的组件库可以使用[也可能是我没找到],所以请求图片只能采用xhr方式来异步加载.下面就是在做这 ...
- js - 面向对象--手稿
- Navicat for mysql 无法连接到虚拟机的linux系统下的mysql
最近在linux Centos7版本的虚拟机上安装了一个MySql数据库,发现本地可以正常ping通虚拟机,但Navicat则无法正常连接到虚拟机里的MySql数据库,经过一番琢磨,发现解决这个问题的 ...
- 【干货】顶级 Java 源码教程项目大汇总!
大家好,我是鱼皮,今天分享几个 GitHub 上顶级的 Java 源码教程项目. 区别于书籍.文档.视频等形式的教程,这些项目几乎都是由 精简的代码片段 和 Demo 组成的,能够轻松地在本地执行,非 ...