首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年08月01日 08:13

大家好,我是码农先森。

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


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

From:https://www.cnblogs.com/yxhblogs/p/18272316
本文地址: http://www.shuzixingkong.net/article/654
0评论
提交 加载更多评论
其他文章 低代码如何借助 K8s 实现高并发支持?
引言 在当今这个数字化时代,互联网的普及和技术的飞速发展使得应用程序面临着前所未有的挑战,其中最为显著的就是高并发访问的需求。随着用户数量的激增和业务规模的扩大,如何确保应用在高并发场景下依然能够稳定运行、快速响应,成为了所有开发者和技术团队必须面对的重要课题。 Kubernetes(K8s),作为
低代码如何借助 K8s 实现高并发支持? 低代码如何借助 K8s 实现高并发支持? 低代码如何借助 K8s 实现高并发支持?
吃透 JVM 诊断方法与工具使用
JVM(Java虚拟机)是Java程序运行的基础环境,它提供了内存管理、线程管理和性能监控等功能。吃透JVM诊断方法,可以帮助开发者更有效地解决Java应用在运行时遇到的问题。以下是一些常见的JVM诊断方法: 使用JConsole: JConsole是一个可视化监控工具,可以连接到本地或远程的JVM
推荐一款基于人工智能驱动的无代码自动化测试平台!
今天给大家推荐一款基于人工智能驱动的无代码自动化测试平台:testRigor! 1、testRigor介绍 简单来说,testRigor是一款基于人工智能驱动的无代码自动化测试平台,它能够通过分析应用的行为模式,智能地生成测试用例,并自动执行这些测试,无需人工编写测试脚本。可以用于Web、移动、AP
推荐一款基于人工智能驱动的无代码自动化测试平台! 推荐一款基于人工智能驱动的无代码自动化测试平台! 推荐一款基于人工智能驱动的无代码自动化测试平台!
救园行动——赞助商计划
在发出求救信后,很多园友出手相救,非常感谢大家的支持! 在求救的同时,我们也在想办法奋力自救,会采取一系列的救园行动,这一次一定要把园子救下来,因为没有下一次了。 今天发布的救园行动是赞助商计划,想找10家企业赞助园子,并成为园子的创始赞助商。 有人可能会笑话这个救园计划是一个幼稚的想法,没有直接的
救园行动——赞助商计划
canvas实现截图功能
开篇 最近在做一个图片截图的功能。 因为工作时间很紧张, 当时是使用的是一个截图插件。 周末两天无所事事,来写一个简单版本的截图功能。 因为写的比较简单,如果写的不好,求大佬轻一点喷 读取图片并获取图片的宽度和高度思路 首先读取文件我们使用input中类型是file。 我们需要对读取的对象进行限制,
canvas实现截图功能 canvas实现截图功能 canvas实现截图功能
SemanticKernel/C#:检索增强生成(RAG)简易实践
检索增强生成(RAG)是什么? RAG是“Reference-based Generative model with Attention”的缩写,也可以被称为“Retrieval-Augmented Generation”,是一种结合了检索技术和生成模型的方法,主要用于自然语言处理任务,如文本生成、
SemanticKernel/C#:检索增强生成(RAG)简易实践 SemanticKernel/C#:检索增强生成(RAG)简易实践 SemanticKernel/C#:检索增强生成(RAG)简易实践
02.计算器存储器的原理
02.计算器存储器的原理 目录介绍 01.什么是存储器 1.1 了解存储器是什么 1.2 存储器类型 02.存储器系统设计 2.1 存储器分层设计 2.2 存储器层次结构 2.3 高速缓存设计思想 2.4 虚拟内存访问内存 03.存储器类型 3.1 按照材质划分 3.2 按芯片类型划分 3.3 内存
02.计算器存储器的原理
.NET 结果与错误处理利器 FluentResults
前言 在项目开发中,方法返回的结果(成功或失败)对我们开发来说很重要。传统方法,如通过异常来指示错误或使用特定的返回类型(如布尔值加输出参数),虽然有效,但可能缺乏直观性和灵活性。 FluentResults库应运而生,它以一种既流畅又富有表达力的方式,极大地优化了这一过程。通过使用FluentRe
.NET 结果与错误处理利器 FluentResults .NET 结果与错误处理利器 FluentResults .NET 结果与错误处理利器 FluentResults