Golang - 时间处理总结

news2024/9/21 12:47:13

Golang - 时间处理总结

  • 1 获取时间对象
    • 1.1 获取当前对象对象
    • 1.2 根据指定时间返回 time.Time 类型
    • 1.2 获取当前年月日时分秒、星期几、一年中的第几天等操作
    • 1.3 日期字符串解析成 time.Time 类型
        • 解析的时候需要特别注意时区的问题:
  • 2 时间对象转时间字符串
  • 3 时区
  • 4 时间运算
  • 5 时间比较
  • 6 时间戳
  • 7 常见例子
    • 7.1 日期格式 转 时间戳
    • 7.2 获取当前时间日期格式
    • 7.3 时间戳 to 日期格式

1 获取时间对象

1.1 获取当前对象对象

//1. 获取时间对象
now := time.Now()
fmt.Println(now) //2023-01-01 20:17:23.660881 +0800 CST m=+0.000095522

1.2 根据指定时间返回 time.Time 类型

now := time.Now()
layout := "2006-01-02 15:04:05"

//根据指定时间返回 time.Time 类型
//分别指定年,月,日,时,分,秒,纳秒,时区
t := time.Date(2011, time.Month(3), 12, 15, 30, 20, 0, now.Location())
fmt.Println(t.Format(layout))

1.2 获取当前年月日时分秒、星期几、一年中的第几天等操作

now := time.Now() //返回当前年月日时分秒、星期几、一年中的第几天等操作

// 返回日期
year, month, day := now.Date()
fmt.Printf("year:%d, month:%d, day:%d\n", year, month, day) //year:2023, month:1, day:1
// 年
fmt.Println(now.Year()) //2023
// 月
fmt.Println(now.Month()) //January
// 日
fmt.Println(now.Day()) //1

// 时分秒
hour, minute, second := now.Clock()
fmt.Printf("hour:%d, minute:%d, second:%d\n", hour, minute, second) //hour:21, minute:2, second:25
// 时
fmt.Println(now.Hour()) //21
// 分
fmt.Println(now.Minute()) //2
// 秒
fmt.Println(now.Second()) //25

// 返回星期
fmt.Println(now.Weekday()) //Sunday
//返回一年中对应的第几天
fmt.Println(now.YearDay()) //1
//返回时区
fmt.Println(now.Location()) //Local

// 返回一年中第几天
fmt.Println(now.YearDay()) //1

1.3 日期字符串解析成 time.Time 类型

//2. 时间字符串转时间对象
ts := "2022-07-01 00:00:00"
layout := "2006-01-02 15:04:05" //格式化模版
t1, err := time.Parse(layout, ts)
if err != nil {
	panic(err)
}
fmt.Println(t1) //2022-07-01 00:00:00 +0000 UTC

t, _ := time.ParseInLocation("2006-01-02 15:04:05", time.Now().Format("2006-01-02 15:04:05"), time.Local)
fmt.Println(t)  
// 输出 2021-01-10 17:28:50 +0800 CST
// time.Local 指定本地时间

解析的时候需要特别注意时区的问题:

fmt.Println(time.Now())            //2023-01-01 21:12:49.314002 +0800 CST m=+0.000078476
fmt.Println(time.Now().Location()) //Local
t, _ := time.Parse("2006-01-02 15:04:05", "2021-01-10 15:01:02")
fmt.Println(t) //2021-01-10 15:01:02 +0000 UTC
t2, _ := time.ParseInLocation("2006-01-02 15:04:05", "2021-01-10 15:01:02", time.Local)
fmt.Println(t2) //2021-01-10 15:01:02 +0800 CST

可以看到,time.Now() 使用的 CST(中国标准时间),而 time.Parse() 默认的是 UTC(零时区),它们相差 8 小时。所以解析时常用 time.ParseInLocation(),可以指定时区。

重点!!!

画了张图,帮助大家理清时间戳、time.Time 和 日期格式 之间的转化关系:

在这里插入图片描述

2 时间对象转时间字符串

Go 语言提供了时间类型格式化函数Format(),需要注意的是 Go 语言格式化时间模板不是常见的 Y-m-d H:i:s,而是 2006-01-02 15:04:05,也很好记忆(2006 1 2 3 4 5)。

//1. 获取时间对象
now := time.Now()
fmt.Println(now) //2023-01-01 20:17:23.660881 +0800 CST m=+0.000095522
//2. 时间格式化输出
layout := "2006-01-02 15:04:05" //格式化模版
fmt.Println(now.Format(layout)) //2023-01-01 20:21:39

fmt.Println(now.Format("2006-01-02"))
fmt.Println(now.Format("15:03:04"))
fmt.Println(now.Format("2006/01/02 15:04"))
fmt.Println(now.Format("15:04 2006/01/02"))

3 时区

//1. 获取时间对象
now := time.Now()
layout := "2006-01-02 15:04:05" //格式化模版
ts := "2022-07-01 00:00:00"

//4. 时区
loc1, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
	panic(err)
}
t2, err := time.ParseInLocation(layout, ts, loc1)
if err != nil {
	panic(err) 
}
fmt.Println(t2) //2022-07-01 00:00:00 +0800 CST

loc2, err := time.LoadLocation("America/New_York")
if err != nil {
	panic(err)
}
fmt.Println(now.In(loc2)) //2023-01-01 07:27:14.780709 -0500 EST

4 时间运算

//获取时间对象
now := time.Now()
fmt.Println(now) //2023-01-01 20:52:18.838167 +0800 CST m=+0.000093743

//5. 时间运算
fmt.Println(now.Add(1 * time.Hour)) //当前时间+1小时     2023-01-01 21:52:18.838167 +0800 CST m=+3600.000093743
fmt.Println(now.AddDate(0, 1, 1))   //当前时间+1个月零1天 2023-02-02 20:52:18.838167 +0800 CST

// 1小时1分1s之后
t1, _ := time.ParseDuration("1h1m1s")
fmt.Println(t1)
m1 := now.Add(t1)
fmt.Println(m1)

// 1小时1分1s之前
t2, _ := time.ParseDuration("-1h1m1s")
m2 := now.Add(t2)
fmt.Println(m2)

// 3小时之前
t3, _ := time.ParseDuration("-1h")
m3 := now.Add(t3 * 3)
fmt.Println(m3)

// 10 分钟之后
t4, _ := time.ParseDuration("10m")
m4 := now.Add(t4)
fmt.Println(m4)

// Sub 计算两个时间差
sub1 := now.Sub(m3)
fmt.Println(sub1.Hours())   // 相差小时数
fmt.Println(sub1.Minutes()) // 相差分钟数

额外再介绍两个函数 time.Since()、time.Until():

// 返回当前时间与 t 的时间差,返回值是 Duration
time.Since(t Time) Duration

// 返回 t 与当前时间的时间差,返回值是 Duration
time.Until(t Time) Duration

now := time.Now()
fmt.Println(now)

t1, _ := time.ParseDuration("-1h")
m1 := now.Add(t1)
fmt.Println(m1)
fmt.Println(time.Since(m1))
fmt.Println(time.Until(m1))

输出:

2021-01-10 20:41:48.668232 +0800 CST m=+0.000095594
2021-01-10 19:41:48.668232 +0800 CST m=-3599.999904406
1h0m0.000199007s
-1h0m0.000203035s

5 时间比较

now := time.Now() 
ts := "2022-07-01 00:00:00"
layout := "2006-01-02 15:04:05" //格式化模版
t1, err := time.Parse(layout, ts)
if err != nil {
	panic(err)
}

fmt.Println(now) //2023-01-01 20:17:23.660881 +0800 CST m=+0.000095522
fmt.Println(t1) //2022-07-01 00:00:00 +0000 UTC

//6. 时间的比较
fmt.Println(now.Equal(t1))  // =
fmt.Println(now.After(t1))  // >
fmt.Println(now.Before(t1)) // <

输出:

false
true
false

6 时间戳

now := time.Now()  //2023-01-01 20:52:18.838167 +0800 CST m=+0.000093743

//7. 时间戳
fmt.Println(now.Unix())      //时间戳 秒
fmt.Println(now.UnixMilli()) //时间戳 毫秒
fmt.Println(now.UnixMicro()) //时间戳 微妙
fmt.Println(now.UnixNano())  //时间戳 纳秒

输出:

1672577538
1672577538838
1672577538838167
1672577538838167000

7 常见例子

下面列举一些常见的例子和函数封装。

7.1 日期格式 转 时间戳

func TimeStr2Time(fmtStr,valueStr, locStr string) int64 {
    loc := time.Local
    if locStr != "" {
        loc, _ = time.LoadLocation(locStr) // 设置时区
    }
    if fmtStr == "" {
        fmtStr = "2006-01-02 15:04:05"
    }
    t, _ := time.ParseInLocation(fmtStr, valueStr, loc)
    return t.Unix()
}

7.2 获取当前时间日期格式

func GetCurrentFormatStr(fmtStr string) string {
    if fmtStr == "" {
        fmtStr = "2006-01-02 15:04:05"
    }
    return time.Now().Format(fmtStr)
}

7.3 时间戳 to 日期格式

func Sec2TimeStr(sec int64, fmtStr string) string {
    if fmtStr == "" {
        fmtStr = "2006-01-02 15:04:05"
    }
    return time.Unix(sec, 0).Format(fmtStr)
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

严格模式和高阶函数

1、什么是严格模式 JavaScript 除了提供正常模式外&#xff0c;还提供了严格模式&#xff08;strict mode&#xff09;。 ES5 的严格模式是采用具有限制性 JavaScript 变体的一种方式&#xff0c;即在严格的条件下运行 JS 代码。 严格模式在 IE10 以上版本的浏览器中才会被支…

【C++】-- C++11 - 右值引用和移动语义(上万字详细配图配代码从执行一步步讲解)

目录 左值引用和右值引用 右值引用使用场景和意义 移动语义 传值返回问题 移动构造 移动赋值 总结 解决传值插入问题 完美转发 模板中的&&万能引用 完美转发std::forward 完美转发实际中的使用场景 左值引用和右值引用 其实在C11之前&#xff0c;C没有左右…

系统管理员喜欢 systemd 的 5 个理由

导读systemd 的速度和易用性使其成为管理现代 Linux 系统的流行方式。 系统管理员知道&#xff0c;在一台运行着的现代计算机上会发生很多事情&#xff1a;应用程序在后台运行、预定事件等待在特定时间被触发、事件写入日志文件、发送状态报告。在以前&#xff0c;不同的进程可…

为什么深度神经网络这么难训练

目录 1、深度网络训练困难的原因&#xff1a; 2、消失的梯度问题 3、不稳定的梯度问题 参考文章&#xff1a;为什么很难训练深度神经网络&#xff1f; - 腾讯云开发者社区-腾讯云 1、深度网络训练困难的原因&#xff1a; 训练速度慢 在深度网络中&#xff0c;不同的层学习…

《UEFI内核导读》UEFI Firmware Storage简介

敬请关注&#xff1a;“固件C字营 UEFI固件一般存储在被称之为“固件仓库”的非易失性存储器中&#xff0c;简称为FD&#xff08;固件设备&#xff09;&#xff0c;当前主流的存储介质是NorFlash它拥有非易失性、XIP以及可二次编程的特性。 固件设备可以分为物理设备和逻辑设备…

linux如何发送查收邮件的详解

一&#xff0c;linux用户发送给linux中的其它用户 1&#xff0c;使用命令 yum install sendmail -y安装sendmail软件 2&#xff0c;使用yum install mailx -y安装 mailx软件 3&#xff0c;使用命令systemctl start sendmail启动sendmail&#xff08;此过程消耗时间&#xff09…

你在项目里遇到的最大困难是什么,如何解决的?

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/Tyson0314/Java-…

Weiler-Atherton 算法介绍(简单易懂)

目录 一、算法介绍 二、算法描述 三、算法总结 一、算法介绍 Weiler Atherton多边形裁剪算法是一种允许裁剪凹面算法的算法。与 Sutherland-Hodgman 多边形裁剪算法最主要的区别是&#xff0c;该算法能够裁剪凹多边形&#xff0c;并不留下任何残留物。 裁剪示意图&#xff1…

关于微服务,这些你都了解吗-微服务介绍

文章目录一 认识微服务1.1 什么是微服务1.2 微服务的特点1.3 微服务诞生背景1.4 微服务架构的优势二 微服务生态1.1 硬件层1.2 通信层1.3 应用平台层1.4 微服务层三 微服务详解1.1 微服务架构1.2 服务注册和发现1.3 rpc调用和服务监控四 微服务与DDD1.1 什么是DDD1.2 DDD作用1.…

python快速实现某东方视频解密wasm算法

开始之前请大家先去了解一下 wasm这种技术(可以百度搜索一下 WebAssembly是什么?) 现在开始.... 1&#xff0c;先看一张图 首先写一个本地加载wasm的方法 00043706.wasm就是当前网站load的wasm库,如果遇到报错,请联系我&#xff0c;文章最后有qq联系方式 let u {} functio…

C++类和对象2:默认成员函数

我们通过this指针可以看出来&#xff0c;C其实隐藏了非常多的东西&#xff0c;很多事情它会在编译的时候包揽&#xff0c;那么作为最为重要的类和对象&#xff0c;它是不是还隐含了更多我们平常看不到的东西呢&#xff1f; 我们创建一个空类里面啥也不放。 class Text{}; 看上…

2_类加载子系统

目录 概述 类加载器子系统作用 类的加载过程 加载阶段 加载class文件的方式 链接阶段 准备 Prepare 解析 Resolve 初始化阶段 类加载器的分类 虚拟机自带的加载器 扩展类加载器&#xff08;Extension ClassLoader&#xff09; 应用程序类加载器&#xff08;系统类加…

阿里云计算工程师ACP考题归类解析

目录考纲答题技巧四式记的牢三妙招一、对象存储OSS二、专有网络VPC三、服务器ECS四、安全五、阿里云弹性伸缩Auto Scaling五、内容分发网络CDN总结考纲 重点学习ECS、VPC、OSS三部分。 答题技巧四式 战略是先做简单后做难度高的。 一、简化 做题问三个问题&#xff0c;按回答…

【云原生 | Kubernetes 实战】20、K8s Ingress 实现业务灰度发布

目录 通过 Ingress-nginx 实现灰度发布 一、Ingress Controller 多种发布策略介绍 场景一&#xff1a;将新版本灰度给部分用户 场景二&#xff1a;切一定比例的流量给新版本 二、模拟部署生产测试版本 Web 服务 2.1 部署一个 v1 版本: 2.2 再部署一个 v2 版本: 2.3 再…

论文投稿指南——中文核心期刊推荐(化学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

本地方法接口

什么是本地方法 简单地讲&#xff0c;一个Native Methodt是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法&#xff1a;该方法的实现由非Java语言实现&#xff0c;比如C。这个特征并非Java所特有&#xff0c;很多其它的编程语言都有这一机制&#xff0c;…

AQS核心原理之

AQS系列 1、AQS核心原理之 2、ReentrantLock 原理及示例 文章目录AQS系列一、什么是AQS?二、AQS特性三、AQS内部维护 state四、队列4.1 同步等待队列4.2 条件等待队列5、总结一、什么是AQS? AQS全称是 AbstractQueuedSynchronizer&#xff08;抽象对了同步器&#xff09;&am…

Cento6从零开始用Nginx+mysql+php搭建Discuz在线论坛系统

首先我的liunx使用版本是 centos6.5 32位 discuz版本是Discuz_X3.2_SC_UTF8.zip Xshell版本是6 xftp是7版本 mysql也是是这个版本&#xff1a;mysql这里写目录标题1.yum安装php2.安装nginx包3.安装php-fpm4.安装php-mysql5. 安装Discuz在线论坛系统由于目前yum源已经无法使用需…

力扣 2037. 使每位学生都有座位的最少移动次数

题目 一个房间里有 n 个座位和 n 名学生&#xff0c;房间用一个数轴表示。给你一个长度为 n 的数组 seats &#xff0c;其中 seats[i] 是第 i 个座位的位置。同时给你一个长度为 n 的数组 students &#xff0c;其中 students[j] 是第 j 位学生的位置。 你可以执行以下操作任…