时间编程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