页面载入中,请稍候...

golang中获取时间操作(年、月、日、时、分、秒、时区)

2014-02-02 14:15:46    作者:user    来源:会员投稿    评论:读取中    点击:读取中    [我要投稿]

编程离不开时间,时间管理,严格的说分成两块,一个是当前的时刻,对应的是一个点,还有是一段时间间隔。取到UNIX epoch time.now := t...

编程离不开时间,时间管理,严格的说分成两块,一个是当前的时刻,对应的是一个点,还有是一段时间间隔。

取到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()

  1. if cur_month == time.November {
  2.     ...
  3. }

    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)

  1. year,mon,day = now.Date()

    获取Hour 
func (Time) Hour() int
cur_hour := now.Hour()

  1. Minute可以通过Minute()返回,second可以通过Second()返回。


    time还提供了Clock()的同时返回 hour,minute,second = now.Clock().

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)
    }

 


输出
---------------------
UTC time is 2013-11-22 15:51:22 UTC
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. const (
  3.         Nanosecond Duration = 1
  4.         Microsecond = 1000 * Nanosecond
  5.         Millisecond = 1000 * Microsecond
  6.         Second = 1000 * Millisecond
  7.         Minute = 60 * Second
  8.         Hour = 60 * Minute
  9. )

    Duration类型有Minutes()/Second()/Nanoseconds(), 将duration折算成分钟/秒/纳秒。    

  1.     now := time.Now()
  2.     time.Sleep(3*time.Second);
  3.     end_time := time.Now()
  4.  
  5.     var dur_time time.Duration = end_time.Sub(now)
  6.     var elapsed_min float64 = dur_time.Minutes()
  7.     var elapsed_sec float64 = dur_time.Seconds()
  8.     var elapsed_nano int64 = dur_time.Nanoseconds()
  9.     fmt.Printf("elasped %f minutes or \nelapsed %f seconds or \nelapsed %d nanoseconds\n",
  10.                 elapsed_min,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还有很多其他的内容,我就不一一赘述了。

相关热词搜索:golang   获取   时间  

上一篇:weed-fs:一个用Golang开发的开源分布式存储项目
下一篇:加盐密码哈希:如何正确使用

分享到: 收藏