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 +%s
2. 1385131172

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



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



        golang中一个很重要的表征时间的数据类型是Time,基本就是三个成员变量 sec ,nsec,Location,详细意思可以参看注释。



      1. type Time struct {
      2. of
      3. , year 1 00:00:00 UTC.
      4.  sec int64
      5.         
      6. -negative nanosecond
      7. .
      8. in the range [0, 999999999].
      9.  nsec int32
      10.         
      11.             // loc specifies the Location that should be used to
      12. , hour, month, day, and
      13. this Time.
      14. .
      15. In that case it is interpreted to mean UTC.
      16.  loc *Location
      17.         }



          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() int
      2. 
      3. cur_year := now.Year()


          获取Month


      1. func (t Time) Month() Month
      2. 
      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.         February
      4.         March
      5.         April
      6.         May
      7.         June
      8.         July
      9.         August
      10.         September
      11.         October
      12.         November
      13.         December
      14. )


          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() int
        1. := 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 main
            2. 
            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. C版本的输出
            2. ------------------
            3. UTC   time is 2013-10-22 15:49:18 GMT
            4. local time is 2013-10-22 23:49:18 CST
            5. 
            6. go版本的输出
            7. ---------------------
            8. UTC   time is 2013-11-22 15:51:22 UTC
            9. local time is 2013-11-22 23:51:22 CST

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


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


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


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


                Duration类型有Minutes()/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 or
              3. elapsed 3000292435 nanoseconds


              ------------------------------------------------------------------------------------------------------------------------------------------------
              第二部分描述Duration明显用到了Sleep()函数,这个函数是以纳秒为单位的,相当于C语言中的nanosleep()


              1. #include <time.h>
              2. nanosleep(): _POSIX_C_SOURCE >= 199309L
              3. 
              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