time标准库的介绍和使用

time标准库

时间在日常编程中使用非常多。time标准库中日历的计算采用的是公历

1. Time类型

  • Time代表一个纳秒精度的时间点。

  • 程序中应使用Time类型值来保存和传递时间,而不能用指针。就是说,表示时间的变量和字段,应为time.Time类型,而不是*time.Time.类型。

  • 一个Time类型值可以被多个goroutine同时使用。

  • 时间点可以使用BeforeAfterEqual方法进行比较。

  • Sub方法让两个时间点相减,生成一个Duration类型值(代表时间段)。

  • Add方法给一个时间点加上一个时间段,生成一个新的Time类型时间点。

  • Time零值代表时间点January 1, year 1, 00:00:00.000000000 UTC。因为本时间点一般不会出现在使用中,IsZero方法提供了检验时间是否显式初始化的一个简单途径。

  • 每一个时间都具有一个地点信息(及对应地点的时区信息),当计算时间的表示格式时,如FormatHourYear等方法,都会考虑该信息。

  • LocalUTCIn方法返回一个指定时区(但指向同一时间点)的Time。修改地点/时区信息只是会改变其表示;不会修改被表示的时间点,因此也不会影响其计算。


func timeDemo() {now := time.Now() //获取当前时间fmt.Printf("current time:%v\n", now)year := now.Year()     //年month := now.Month()   //月day := now.Day()       //日hour := now.Hour()     //小时minute := now.Minute() //分钟second := now.Second() //秒//02d输出的整数不足两位 用0补足fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}

2. 时间戳

时间戳是自1970年1月1日0时0分0秒至当前时间的总毫秒数。它也被称为Unix时间戳(UnixTimestamp)。

这里指的是UTC时间,比北京时间晚8个小时。

func timestampDemo() {now := time.Now()            //获取当前时间timestamp1 := now.Unix()     //时间戳timestamp2 := now.UnixNano() //纳秒时间戳fmt.Printf("current timestamp1:%v\n", timestamp1)fmt.Printf("current timestamp2:%v\n", timestamp2)
}

3. Parse解析时间

func Parse(layout, value string) (Time, error)

解析一个格式化的时间字符串并返回它代表的时间,如果缺少表示时区的信息,Parse会将时区设置为UTC。

func ParseInLocation(layout, value string, loc *Location) (Time, error)

ParseInLocation类似Parse但有两个重要的不同之处。第一,当缺少时区信息时,Parse将时间解释为UTC时间,而ParseInLocation将返回值的Location设置为loc;第二,当时间字符串提供了时区偏移量信息时,Parse会尝试去匹配本地时区,而ParseInLocation会去匹配loc。

layout的时间必须是"2006-01-02 15:04:05"这个时间,当然格式不一定是这个,时间一定得是,这是go诞生的时间


func timeParse() {t, err := time.Parse("2006-01-02 15:04:05", "2022-07-28 18:06:00")if err != nil {panic(err)}fmt.Println(t)now := time.Now()fmt.Println(now)// 加载时区loc, err := time.LoadLocation("Asia/Shanghai")if err != nil {fmt.Println(err)return}// 按照指定时区和指定格式解析字符串时间timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", now.Format("2006/01/02 15:04:05"), loc)if err != nil {fmt.Println(err)return}fmt.Println(timeObj)}

4. 格式化时间

func (t Time) Format(layout string) string

Format根据layout指定的格式返回t代表的时间点的格式化文本表示。


func timeFormat() {now := time.Now()// 格式化的模板为Go的出生时间2006年1月2号15点04分05秒// 24小时制fmt.Println(now.Format("2006-01-02 15:04:05.000"))// 12小时制fmt.Println(now.Format("2006-01-02 03:04:05"))fmt.Println(now.Format("2006/01/02 15:04"))fmt.Println(now.Format("15:04 2006/01/02"))fmt.Println(now.Format("2006/01/02"))
}

5. time.Unix()

func Unix(sec int64, nsec int64) Time

Unix创建一个本地时间,对应sec和nsec表示的Unix时间(从January 1, 1970 UTC至该时间的秒数和纳秒数)。

nsec的值在[0, 999999999]范围内是合法的。

func timestampDemo2(timestamp int64) {timeObj := time.Unix(timestamp, 0) //将时间戳转为时间格式fmt.Println(timeObj)year := timeObj.Year()     //年month := timeObj.Month()   //月day := timeObj.Day()       //日hour := timeObj.Hour()     //小时minute := timeObj.Minute() //分钟second := timeObj.Second() //秒fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}

6. 时间间隔

time.Duration是time包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。time.Duration表示一段时间间隔,可表示的最长时间段大约290年。

time包中定义的时间间隔类型的常量如下:

const (Nanosecond  Duration = 1Microsecond          = 1000 * NanosecondMillisecond          = 1000 * MicrosecondSecond               = 1000 * MillisecondMinute               = 60 * SecondHour                 = 60 * Minute
)

例如:time.Duration表示1纳秒,time.Second表示1秒。

7. 时间计算

7.1 Add

func (t Time) Add(d Duration) Time

Add返回时间点t+d。

func main() {now := time.Now()later := now.Add(time.Hour) // 当前时间加1小时后的时间fmt.Println(later)
}

7.2 Sub

求两个时间之间的差值

    func (t Time) Sub(u Time) Duration

返回一个时间段t-u。如果结果超出了Duration可以表示的最大值/最小值,将返回最大值/最小值。

要获取时间点t-d(d为Duration),可以使用t.Add(-d)。

func main() {now := time.Now()later := now.Add(time.Hour) // 当前时间加1小时后的时间ret := later.Sub(now)fmt.Println(ret)
}

7.3 Equal

    func (t Time) Equal(u Time) bool

判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。

本方法和用t==u不同,这种方法还会比较地点和时区信息。

7.4 Before

    func (t Time) Before(u Time) bool

如果t代表的时间点在u之前,返回真;否则返回假。

7.5 After

    func (t Time) After(u Time) bool

如果t代表的时间点在u之后,返回真;否则返回假。

8. 定时器

使用time.Tick(时间间隔)来设置定时器,定时器的本质上是一个通道(channel)

func tickDemo() {ticker := time.Tick(time.Second) //定义一个1秒间隔的定时器for i := range ticker {fmt.Println(i)//每秒都会执行的任务}
}
time.AfterFunc(time.Second*10, func() {fmt.Println("10秒后执行")
})
package mainimport ("fmt""sync""time"
)/**
*ticker只要定义完成,从此刻开始计时,不需要任何其他的操作,每隔固定时间都会触发。
*timer定时器,是到固定时间后会执行一次
*如果timer定时器要每隔间隔的时间执行,实现ticker的效果,使用 func (t *Timer) Reset(d Duration) bool*/
func main() {var wg sync.WaitGroupwg.Add(2)//NewTimer 创建一个 Timer,它会在最少过去时间段 d 后到期,向其自身的 C 字段发送当时的时间timer1 := time.NewTimer(2 * time.Second)//NewTicker 返回一个新的 Ticker,该 Ticker 包含一个通道字段,并会每隔时间段 d 就向该通道发送当时的时间。它会调  //整时间间隔或者丢弃 tick 信息以适应反应慢的接收者。如果d <= 0会触发panic。关闭该 Ticker 可            //以释放相关资源。ticker1 := time.NewTicker(2 * time.Second)go func(t *time.Ticker) {defer wg.Done()for {<-t.Cfmt.Println("get ticker1", time.Now().Format("2006-01-02 15:04:05"))}}(ticker1)go func(t *time.Timer) {defer wg.Done()for {<-t.Cfmt.Println("get timer", time.Now().Format("2006-01-02 15:04:05"))//Reset 使 t 重新开始计时,(本方法返回后再)等待时间段 d 过去后到期。如果调用时t     //还在等待中会返回真;如果 t已经到期或者被停止了会返回假。t.Reset(2 * time.Second)}}(timer1)wg.Wait()
}

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

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

相关文章

算法基础之Kruskal算法求最小生成树

Kruskal算法求最小生成树 核心思想: Kruskal算法 : 将每组数据根据权重排序 小的在前面 判断ab是否已经联通(并查集) 没有的话加上一条边 #include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N 100010 , M 2*N , IN…

redis之五种基本数据类型

redis存储任何类型的数据都是以key-value形式保存&#xff0c;并且所有的key都是字符串&#xff0c;所以讨论基础数据结构都是基于value的数据类型 常见的5种数据类型是&#xff1a;String、List、Set、Zset、Hash 一) 字符串(String) String是redis最基本的类型&#xff0c;v…

【线性代数】期末速通!

1. 行列式的性质 1.1 求一个行列式的值 特殊地&#xff0c;对角线左下全为0&#xff0c;结果为对角线乘积。行 r 列 c 1.2 性质 某行&#xff08;列&#xff09;加上或减去另一行&#xff08;列&#xff09;的几倍&#xff0c;行列式不变某行&#xff08;列&#xff09;乘 …

C++学习笔记(十二)------is_a关系(继承关系)

你好&#xff0c;这里是争做图书馆扫地僧的小白。 个人主页&#xff1a;争做图书馆扫地僧的小白_-CSDN博客 目标&#xff1a;希望通过学习技术&#xff0c;期待着改变世界。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 文章目录 前言 一、继承关系…

Pipelined-ADC设计一:序言

现在是2023年12月18日&#xff0c;准备开新帖&#xff0c;设计一个 流水线型 模数转换器&#xff08; Pipelined-ADC &#xff09;。记录帖&#xff0c;后续会放在咸鱼。同步记录&#xff0c;谨防盗用。 初定指标&#xff1a;12位50Mhz&#xff0c;采用2.5bit每级结构&#xff…

使用DTS将自建MySQL迁移至PolarDB MySQL引擎,探索DTS全量数据校验

1. 领取免费的ECS和PolarDB资源 一旦您注册了阿里云账号并填写了您的账号和支付信息&#xff0c;您就可以申请免费试用我们的产品&#xff08;如ECS、PolarDB、RDS等服务&#xff09;。 1.1. 申请 ECS 免费试用 1. 在 阿里云免费试用中心&#xff0c;找到ECS&#xff0c;单击…

可视化 | 基于CBDB的唐代历史人物分析

文章目录 &#x1f4da;人口统计&#x1f407;唐朝历年人数统计&#x1f407;唐朝人口金字塔&#x1f407;唐朝历年出生死亡人数统计&#x1f407;唐朝人口分布&#x1f407;享年数据分布 &#x1f4da;唐朝人口迁徙&#x1f407;人口迁徙&#x1f407;生卒地变迁 &#x1f4da…

IDEA代码补全不能导入某个类了

问题 今天写单元测试时&#xff0c;突然发现idea自动补全代码时不能自动导入类了&#xff0c; 比如在编辑器中输入Test&#xff0c;正常情况下通过快捷键atl/智能补全提示后可以自动生成导入import org.junit.Test &#xff0c;但是现在不行了。 解决办法 由于在导入Test时不小…

html5新增特性

对于这行代码&#xff0c;要写在html页面的最前端&#xff1a; <!DOCTYPE html> 为什么要写在前面&#xff1f; 这是声明&#xff0c;是html5的新特性 对于html4来说&#xff0c;它有三种声明格式&#xff0c;而html5只需要统一声明&#xff0c;用来告诉浏览器文档使用…

Vue系列之指令 v-once

文章の目录 1、介绍2、用法3、作用写在最后 1、介绍 v-once 指令可以用于任何元素或组件&#xff0c;并在绑定数据后&#xff0c;将其内容标记为一次性的&#xff0c;不再响应数据的更新。v-once 是一个不需要表达式的指令。 2、用法 <span v-once>{{ message }}</…

【JavaWeb学习笔记】11 - WEB工程路径专题

一、工程路径问题 1.引入该问题 通过这几个去访问很麻烦 二、工程路径解决方案 1.相对路径 1.说明:使用相对路径来解决&#xff0c;一 个非常重要的规则:页面所有的相对路径&#xff0c;在默认情况下&#xff0c;都会参考当前浏览器地址栏的路径http:/ /ip:port/工程名/来进…

Go集成elasticsearch8极简demo,光速入门

Go集成elasticsearch8极简demo,光速入门 配置go环境创件go mod工程代码实现配置go环境 编辑器添加goproxy GO111MODULE=on;GOPROXY=https://mirrors.wps.cn/go/,https://goproxy.cn,direct;GOSUMDB=off创件go mod工程 mkdir demo cd demo go mod init demo代码实现 在demo…

JMESPath语言

JMESPath&#xff08;JSON Matching Expression Path&#xff09; 一种查询语言。 主要用于从JSON文档中检索和过滤数据。 通过写表达式提取和处理JSON数据&#xff0c;而无需编写复杂的代码。 功能&#xff1a;数据提取、过滤、转换、排序。 场景&#xff1a;处理API响应…

CentOS7安装Docker及添加阿里云镜像加速详细教程

Docker官方安装教程网站&#xff1a;Install Docker Engine on CentOS | Docker Docs 具体流程如下&#xff1a; 1.确定你是CentOS7及以上版本 cat /etc/redhat-release 2.yum安装gcc相关 yum -y install gcc yum -y install gcc-c 3.安装需要的软件包 3.1安装docker引擎…

如何在Windows上安装 PHP?

安装 PHP 的步骤会根据你使用的操作系统而有所不同。以下是在一些主流操作系统上安装 PHP 的基本指南&#xff1a; 在 Windows 上安装 PHP&#xff1a; 下载 PHP&#xff1a; 访问 PHP for Windows 网站。 下载你需要的 PHP 版本&#xff08;通常是线程安全版本&#xff09;。…

MetaSploit工具的使用

在命令行输入&#xff1a;msfconsole 启动msf msfconsole 另外的方式 msfdb init msfdb run 查看数据库连接状态 db_status 扫描端口并存储 db_nmap 查看扫描到的数据信息 services MSF常用的模式和命令 搜索模块 search 模块名字 使用模块 use 编号 查看模块使用 sho…

leetcode 572. 另一颗树的子树

这道题重在思路&#xff0c;默认大家会判断两个树是否完全相同 我会把一些基础的简单的&#xff08;包括 判断两个树是否完全相同 和之前的 求结点个数 &#xff09;单独出博客&#xff0c;或者放在介绍堆和树的知识点里面 572. 另一颗树的子树 题目 给你两棵二叉树 root 和…

对偶问题笔记(1)

目录 1 从 Lagrange 函数引入对偶问题2. 强对偶性与 KKT 条件3. 对偶性的鞍点特征 1 从 Lagrange 函数引入对偶问题 考虑如下优化问题 { min ⁡ f 0 ( x ) s . t f i ( x ) ≤ 0 , i 1 , ⋯ , p , h j ( x ) 0 , j 1 , ⋯ , q , x ∈ Ω , \begin{align} \begin{cases}\min…

比 Spring Cloud Zuul 更好用的 API 网关

推荐一个 比 spring cloud 更好用的 API 网关。它是一个低代码 API 网关。 https://github.com/fiber-net-gateway/fiber-net-gateway 特性 同样是使用 java 开发&#xff0c;相比与 SpringCloud Zuul&#xff0c;它有很多 鲜明的特点。 低代码 它实现了一个灵活好用的脚本…

《从晨到夜:在日常繁忙中寻找成长与平衡的艺术》

早上8点11分&#xff0c;我睁开眼睛&#xff0c;开始了新的一天。不到半小时&#xff0c;我匆匆出门&#xff0c;开始了日常的“搬砖”工作。从9点15分到公司&#xff0c;到下午6点15分结束工作&#xff0c;我的一天被紧凑的工作安排填满。我在完成技术任务的同时&#xff0c;也…