golang编程之时间编程
编程离不开时间,时间管理,严格的说分成两块,一个是当前的时刻,对应的是一个点,还有是一段时间间隔。本文简单的讲讲go的时间相关的编程,比较简单,高手可以一笑而过。
golang对时间的支持,是package time做的事儿,里面有好多的函数,我就不一一举例学习,毕竟这是官方文档干的事情。我们初步的学习下常用的函数。
第一个是UNIX epoch time,确切的说就是自1970-01-01 00:00:00 GMT以来的秒数,不知道如何获取的,可以在shell下执行 date +%s
- manu@manu-hacks:~/code/go/self$ date +%s
- 1385131172
熟悉Linux下C编程的就是time函数的返回值:
- #include <time.h>
- time_t now = time(NULL);
golang中一个很重要的表征时间的数据类型是Time,基本就是三个成员变量 sec ,nsec,Location,详细意思可以参看注释。
- type Time struct {
- // sec gives the number of seconds elapsed since
- // January 1, year 1 00:00:00 UTC.
- sec int64
- // nsec specifies a non-negative nanosecond
- // offset within the second named by Seconds.
- // It must be in the range [0, 999999999].
- nsec int32
- // loc specifies the Location that should be used to
- // determine the minute, hour, month, day, and year
- // that correspond to this Time.
- // Only the zero Time has a nil Location.
- // In that case it is interpreted to mean UTC.
- loc *Location
- }
OK,如何取到UNIX epoch time.
- now := time.Now()
用time package中Now()函数获取到当前的时间信息,Now()函数非常的重要,他是后面一切转换的起始点。从Now()我们获取到了Time,从 Time类型我们从容的获取到UNIX epoch time ,自然获取到year ,month ,day,weekday, hour,minute,second,nanosecond.
获取UNIX epoch time:
- var epoch_seconds int64 = now.Unix()
获取Year
- func (t Time) Year() int
- cur_year := now.Year()
获取Month
- func (t Time) Month() Month
- cur_month := now.Month()
- if cur_month == time.November {
- ...
- }
Month是int类型,fmt.Printf("%v") 或者fmt.Println可以打印出November来,同时Month type有String()函数,输出“November”这样的字符串
- const (
- January Month = 1 + iota
- February
- March
- April
- May
- June
- July
- August
- September
- October
- November
- December
- )
year mon day,这些都可以在Date函数中一并返回:
- func (t Time) Date() (year int, month Month, day int)
- year,mon,day = now.Date()
获取Hour
- func (t Time) Hour() int
- cur_hour := now.Hour()
-
Minute可以通过Minute()返回,second可以通过Second()返回。
time还提供了Clock()的同时返回 hour,minute,second = now.Clock().
在C语言中,我们用gmtime_r获取UTC时间,localtime_r获取本地时间,Golang我们也可以做到
- #include<stdio.h>
- #include<stdlib.h>
- #include<time.h>
- int main()
- {
- time_t now = time(NULL);
- printf("elapsed %d second since 1970-01-01 00:00:00\n",now);
- struct tm now_utc_tm ={0};
- if (gmtime_r(&now,&now_utc_tm) != NULL)
- {
- printf("UTC time is %d-%02d-%02d %02d:%02d:%02d %s\n",
- now_utc_tm.tm_year+1900,now_utc_tm.tm_mon,
- now_utc_tm.tm_mday,now_utc_tm.tm_hour,
- now_utc_tm.tm_min,now_utc_tm.tm_sec,now_utc_tm.tm_zone);
- }
- struct tm now_local_tm = {0} ;
- if(localtime_r(&now,&now_local_tm) != NULL)
- {
- printf("local time is %d-%02d-%02d %02d:%02d:%02d %s\n",
- now_local_tm.tm_year+1900,now_local_tm.tm_mon,
- now_local_tm.tm_mday,now_local_tm.tm_hour,
- now_local_tm.tm_min, now_local_tm.tm_sec,now_local_tm.tm_zone);
- }
- return 0;
- }
golang的版本是:
- package main
- import "fmt"
- import "time"
- func main(){
- now := time.Now()
- year,mon,day := now.UTC().Date()
- hour,min,sec := now.UTC().Clock()
- zone,_ := now.UTC().Zone()
- fmt.Printf("UTC time is %d-%d-%d %02d:%02d:%02d %s\n",
- year,mon,day,hour,min,sec,zone)
- year,mon,day = now.Date()
- hour,min,sec = now.Clock()
- zone,_ = now.Zone()
- fmt.Printf("local time is %d-%d-%d %02d:%02d:%02d %s\n",
- year,mon,day,hour,min,sec,zone)
- }
输出分别是:
- C版本的输出
- ------------------
- UTC time is 2013-10-22 15:49:18 GMT
- local time is 2013-10-22 23:49:18 CST
- go版本的输出
- ---------------------
- UTC time is 2013-11-22 15:51:22 UTC
- local time is 2013-11-22 23:51:22 CST
-------------------------------------------------------------------------------------------------------------------------------------------------------------
我们另一个关心的话题,是时间间隔,比如我们profile一个以非常耗时的function,我们会在函数开始前记下时刻值,函数结束后,再次记录下时刻值,然后两者的差值,就是函数运行时间。
这表明Time是可以相减的,
- start_time := time.Now()
- expensive_function
- end_time :=time.Now()
- var duration Duration = end_time.Sub(start_time)
Duration是一种数据类型,其实是个int64类型,表征的是两个时刻之间的纳秒数。
- type Duration int64
- const (
- Nanosecond Duration = 1
- Microsecond = 1000 * Nanosecond
- Millisecond = 1000 * Microsecond
- Second = 1000 * Millisecond
- Minute = 60 * Second
- Hour = 60 * Minute
- )
Duration类型有Minutes()/Second()/Nanoseconds(), 将duration折算成分钟/秒/纳秒。
- now := time.Now()
- time.Sleep(3*time.Second);
- end_time := time.Now()
- var dur_time time.Duration = end_time.Sub(now)
- var elapsed_min float64 = dur_time.Minutes()
- var elapsed_sec float64 = dur_time.Seconds()
- var elapsed_nano int64 = dur_time.Nanoseconds()
- fmt.Printf("elasped %f minutes or \nelapsed %f seconds or \nelapsed %d nanoseconds\n",
- elapsed_min,elapsed_sec,elapsed_nano)
输出如下:
- elasped 0.050005 minutes or
- elapsed 3.000292 seconds or
- elapsed 3000292435 nanoseconds
------------------------------------------------------------------------------------------------------------------------------------------------
第二部分描述Duration明显用到了Sleep()函数,这个函数是以纳秒为单位的,相当于C语言中的nanosleep()
- #include <time.h>
- nanosleep(): _POSIX_C_SOURCE >= 199309L
- int nanosleep(const struct timespec *req, struct timespec *rem);
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
Go中的time.Sleep一律是以纳秒为单位的,当然本质是Duration类型:
如果sleep 3秒中需要写成:
- time.Sleep(3000000000)
这太不方便了,所以,Golang可以写成
- time.Sleep(3*time.Second);
这样可读性就好多了,当然还有time.Minute,time.Hour
这个time package还有很多其他的内容,我就不一一赘述了。
参考文献:
1 golang package time
相关推荐
Go-Golang编程语言以其高效的并发模型闻名,它利用了CSP(Communicating Sequential Processes)的概念,通过goroutines和channels来实现。在这个标题为“Go-Golang编程语言的并发性跟踪和可视化工具”的主题中,...
《Golang语言编程》中文版教程是一份专为初学者设计的全面学习资源,旨在帮助读者快速掌握Go语言的基础知识和核心概念。Go语言,又称Golang,是Google在2009年推出的开源编程语言,它以简洁、高效、并发支持著称,...
无论你是学生,还是希望转行进入IT行业的职场人士,或者是对编程充满好奇的编程爱好者,都可以通过这份教程入门Golang编程。 使用场景及目标: 这份Golang入门教程可以在各种学习场景中使用。你可以在业余时间自学...
总的来说,《Golang编程课程》将引导我们全面掌握Go语言的各个方面,使我们能够编写出高效、可维护的Go代码,参与到大型的系统开发之中。无论是初学者还是有一定经验的开发者,都能从这门课程中受益匪浅。
Golang编程实例精选 Golang是云计算和网络中越来越多的应用语言之一,正和Java一起成为后端的主力编程语言。以下是从"学习Golang编程实例精选"文件中提取的重要知识点: 1. Go语言简介:Go语言是一种静态类型、...
讲述golang编程语言基础,ppt格式,我看了下 还不错 可以参考
《Golang Web编程》英文版是一本专门针对使用Go语言进行Web开发的图书,适合对Go语言有一定了解并希望深入Web开发的读者。Go语言,由Google开发,以其简洁的语法、高效的性能以及内置的并发支持,近年来在Web开发...
在Golang编程实践中,有一些常见的坑和编程模式是开发者需要特别注意的。首先,Golang是一门以其简洁、高效、并发特性著称的编程语言,它提供了良好的并发支持、静态链接、简洁直观的语法以及语言级别的并发与自动化...
在Golang中,时间处理是编程中不可或缺的一部分。本文将深入探讨两种常用的时间格式化方案,帮助你更好地理解和使用Golang中的时间处理功能。我们将会分析`time.Now()`函数的用法以及如何自定义时间格式。 首先,让...
### Golang编程中的常量与变量详解 #### 一、引言 在计算机编程中,理解和熟练掌握常量与变量的概念对于任何初学者来说都是至关重要的。本文将深入探讨Go语言(Golang)中的常量与变量,为读者提供一份详尽的指南...
Golang的web开发入门书籍,写的挺好的,排版佳。可读性强
Golang核心编程.md
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的、C风格的编程语言。它在设计时兼顾了开发效率和系统性能,因此在云计算、微服务和网络编程等领域得到广泛应用。 书中的内容...
Golang精编100题涵盖了Golang编程语言的基础知识点和部分进阶内容,是Golang编程入门和进阶学习者的优质资源。本材料中包含了不同难度级别的题目,例如选择题、填空题、判断题和面试题,这些题目旨在帮助学习者从...
Golang作为一种流行的编程语言,拥有丰富的开发资源,这些资源对于Golang开发者来说至关重要。以下是一些主要的Golang开发资源: 一、官方资源 官方教程:Golang官方提供了全面而权威的入门教程,是学习Golang的...
Go语言,也称为Golang,是由Google开发的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言,旨在提高开发效率和系统性能。本手册涵盖了Go语言的基本语法、核心概念以及高级特性,下面将对其中的主要知识点...
在GOLANG中,解决这个问题需要对网络编程原理和GOLANG的网络库有深入理解。本文将详细介绍如何使用GOLANG来解决SOCKET通信中的粘包问题。 首先,理解粘包产生的原因。TCP协议是基于流的,没有明确的数据边界。它会...
golang语言编程技巧与实践卷一_资源分享