当前位置: 首页 > 图灵资讯 > 技术篇> golang编程之时间编程

golang编程之时间编程

来源:图灵教育
时间:2023-06-14 09:47:29

时间编程golang编程

编程离不开时间和时间管理。严格来说,它分为两部分。一个是当前时刻,对应一个点和一段时间间隔。本文简要介绍了与go时间相关的编程,相对简单,大师可以一笑置之。 golang对时间的支持是package time做的事情,里面有很多函数,我就不一一学习了,毕竟这是官方文档做的事情。对常用函数进行初步学习。 第一个是UNIX epoch time,确切地说,从1970-01-01开始 00:00:00 不知道如何获得GMT以来的秒数,可以在shell下执行 date +%s

1. manu@manu-hacks:~/code/go/self$ date +%s2. 1385131172

time函数的返回值是熟悉Linux下C编程的:

    1. <time.h>2. 3. now = time(NULL);

    代表golang时间的一个非常重要的数据类型是Time,基本上是三个成员的变量 sec ,nsec,Location,详见注释。

      1. type Time struct {2. of3. , year 1 00:00:00 UTC.4.  sec int645.         6. -negative 7d7nanosecond77. .8. in the range [0, 999999999].9.  nsec int3210.         11.             // loc specifies the Location that should be used to12. , hour, month, day, and13. this Time.14. .15. In that case it is interpreted to mean UTC.16.  loc *Location17.         }

      OK,如何获得UNIX? epoch time.

      1. now := time.Now()2.

      用time package中Now()函数获取当前时间信息,Now()函数很重要,他是后面所有转换的起点。我们从Now()获得了Time,从 我们从容地获取Time类型UNIX epoch time ,自然获得year ,month ,day,weekday,hour,minute,second,nanosecond. 获取UNIX epoch time:

      1. = now.Unix()

      获得Year

      1. func (t Time) Year() int2. 3. cur_year := now.Year()

      获取Month

      1. func (t Time) Month() Month2. 3. cur_month := now.Month()4. 5. if cur_month == time.November {6.     ...7. }

      Month是int类型,fmt.Printf("%v") 或者fmt.Println可以打印November,Month type有String()函数,输出“November"这样的字符串

      1. const (2. = 1 +3.         February4.         March5.         April6.         May7.         June8.         July9.         August10.         September11.         October12.         November13.         december14. )

      year mon day,所有这些都可以在Date函数中返回:

        1. func (t Time) Date() (year int, month Month, day int)2. 3. year,mon,day = now.Date()

        获得Hour

        1. func (t Time) Hour() int1. := now.Hour()2.

        Minute可以通过Minute()返回,second可以通过second()返回。 time还提供Clock()同时返回 hour,minute,second = now.Clock(). 在C语言中,我们使用gmtime_r获得UTC时间,localtime_r获得本地时间,我们也可以做Golang

          1. #include<stdio.h>2. #include<stdlib.h>3. #include<time.h>4. 5. 6. int main()7. {8. now = time(NULL);9. ("elapsed %d second since 1970-01-01 00:00:00\n",now);10. 11. ={0};12. if (gmtime_r(&now,&now_utc_tm) != NULL)13. {14. ("UTC time is %d-%02d-%02d %02d:%02d:%02d %s\n",15. .tm_year+1900,now_utc_tm.tm_mon,16. .tm_mday,now_utc_tm.tm_hour,17. .tm_min,now_utc_tm.tm_sec,now_utc_tm.tm_zone);18. }19. 20. = {0} ;21. if(localtime_r(&now,&now_local_tm) != NULL)22. {23. ("local time is %d-%02d-%02d %02d:%02d:%02d %s\n",24. .tm_year+1900,now_local_tm.tm_mon,25. .tm_mday,now_local_tm.tm_hour,26. .tm_min, now_local_tm.tm_sec,now_local_tm.tm_zone);27. }28. 29. ;30. 31. }

          golang的版本是:

            1. package main2. 3. import "fmt"4. import "time"5. 6. 7. 8. func main(){9.     10. now := time.Now()11. year,mon,day := now.UTC().Date()12. hour,min,sec := now.UTC().Clock()13. ,_ := now.UTC().Zone()14. .Printf("UTC time is %d-%d-%d %02d:%02d:%02d %s\n",15. year,mon,day,hour,min,sec,zone)16. 17. year,mon,day = now.Date()18. hour,min,sec = now.Clock()19. ,_ = now.Zone()20. .Printf("local time is %d-%d-%d %02d:%02d:%02d %s\n",21. year,mon,day,hour,min,sec,zone)22. }

            输出分别为:

            1. 输出2C版本. ------------------3. UTC   time is 2013-10-22 15:49:18 GMT4. local time is 2013-10-22 23:49:18 CST5. 6. Go版输出7. ---------------------8. UTC   time is 2013-11-22 15:51:22 UTC9. local time is 2013-11-22 23:51:22 CST

            ------------------------------------------------------------------------------------------------------------------------------------------------------------- 另一个我们关心的话题,是时间间隔。例如,我们的profile是一个非常耗时的function。我们将在函数开始前记录时间值。函数结束后,我们将再次记录时间值,然后两者之间的差异是函数运行时间。 这说明Time可以相减,

            1. start_time := time.Now()2. expensive_function3. end_time :=time.Now()4. 5. var duration Duration = end_time.Sub(start_time)

            Duration是一种数据类型,实际上是int64类型,表示两个时刻之间的纳秒数。

            1. type Duration int642. 3. const (4. =5. = 1000 *6. = 1000 *7. = 1000 *8. = 60 *9. = 60 *10. )

            Minutes()/Duration类型Second()/Nanoseconds(), 将duration转换为分钟/秒/纳秒。

              1.     now := time.Now()2.     time.Sleep(3*time.Second);3. := time.Now()4. 5. time.Duration = end_time.Sub(now)6. = dur_time.Minutes()7. = dur_time.Seconds()8. = dur_time.Nanoseconds()9. .Printf("elasped %f minutes or \nelapsed %f seconds or \nelapsed %d nanoseconds\n",10. ,elapsed_sec,elapsed_nano)

              输出如下:

              1. elasped 0.050005 minutes or 2. elapsed 3.000292 seconds or3. elapsed 3000292435 nanoseconds

              ------------------------------------------------------------------------------------------------------------------------------------------------第二部分描述Duration显然使用了Sleep()函数,该函数以纳秒为单位,相当于C语言中的nanoslep()

              1. #include <time.h>2. nanosleep(): _POSIX_C_SOURCE >= 199309L3. 4. int nanosleep(const struct timespec *req, struct timespec *rem);     #include <unistd.h>   unsigned int sleep(unsigned int seconds);

              Go中的time.Sleep都是以纳秒为单位的,当然本质是Duration类型: 假如sleep 需要在3秒内写成:

              1. time.Sleep(3000000000)

              这太不方便了,Golang可以写成

              1. time.Sleep(3*time.Second);

              这样可读性就好多了,当然还有time。.Minute,time.Hour 这个time package还有很多其他内容,我就不一一赘述了。参考文献: 1 golang package time