Go语言中时间函数及定时器的使用

Go语言中时间函数及定时器、休眠等功能的实现和使用,代码如下,有需要的小伙伴直接拿去

package main

import (
    "time"
    "fmt"
)

func main() {
    // 设置时区,如果name是""或"UTC",返回UTC;
    // 如果name是"Local",返回Local;
    // 否则name应该是IANA时区数据库里有记录的地点名(该数据库记录了地点和对应的时区),如"America/New_York"。
    location,err := time.LoadLocation("America/New_York")
    if err != nil {
        panic(err)
    }

    // 创建时间,依次是:年、月、日、时、分、秒、纳秒(1秒=1000毫秒=1000000微秒=1000000000纳秒)、时区
    t1 := time.Date(2018, 7, 7, 12, 12, 12, 500000000, location)
    fmt.Println(t1)  // 2018-07-07 12:12:12.5 -0400 EDT

    // 将字符串转成时间,时间格式字符串:"2006-01-02 15:04:05"(Go语言规定)
    t2,err := time.Parse("2006-01-02 15:04:05", "2018-07-07 09:10:05")
    fmt.Println(t2) // 2018-07-07 09:10:05 +0000 UTC

    // 将字符串转成时间,需要传入时区
    t3,err := time.ParseInLocation("20060102", "20180707", time.UTC)
    fmt.Println(t3) // 2018-07-07 00:00:00 +0000 UTC

    // 获取当前时间
    t4 := time.Now()
    fmt.Println(t4) // 2018-05-23 20:50:08.9873106 +0800 CST m=+0.012895501

    // 格式化输出
    fmt.Println(t4.Format("2006-01-02 15:04:05")) // 2018-05-23 20:50:08
    fmt.Println(t4.Format("02/01/2006 15:04:05")) // 23/05/2018 20:50:08
    fmt.Println(t4.Format("2006-01-02"))           // 2018-05-23
    fmt.Println(t4.Format("15:04:05"))             // 20:50:08
    fmt.Println(t4.Format("January 2,2006"))      // May 23,2018

    // 获取世界统一时间
    t5 := t4.UTC()
    fmt.Println(t5) // 2018-05-23 12:50:08.9873106 +0000 UTC

    // 获取本地时间
    t6 := t5.Local()
    fmt.Println(t6) // 2018-05-23 20:50:08.9873106 +0800 CST

    // 获取指定时区的时间
    t7 := t6.In(location)
    fmt.Println(t7) // 2018-05-23 08:50:08.9873106 -0400 EDT

    // 获取Unix时间戳,单位:秒,即从时间点1970-01-01 00:00:00 UTC到时间点t所经过的时间
    timestamp := t7.Unix()
    fmt.Println(timestamp) // 1527080185

    // 获取Unix时间戳,单位:纳秒,常用于作为rand的随机数种子
    timestamp = t7.UnixNano()
    fmt.Println(timestamp) // 1527080185738346000

    // 判断两个时间是否相等,会判断时区等信息,不同时区也可以用此进行比较
    fmt.Println(t7.Equal(t6)) // true

    // 判断t4是否在t3之前
    fmt.Println(t4.Before(t3)) // true

    // 判断t4是否在t3之后
    fmt.Println(t4.After(t3))  // false

    // 返回时间的年、月、日
    y,m,d := t4.Date()
    fmt.Printf("年:%d,月:%d,日:%d\n", y, m, d) // 年:2018,月:5,日:23

    // 返回时间的时、分、秒
    h,minute,s := t4.Clock()
    fmt.Printf("时:%d,分:%d,秒:%d\n", h, minute, s) // 时:21,分:5,秒:41

    // 单独获取年、月、日、时、分、秒、星期
    fmt.Printf("年:%d,月:%d,日:%d,时:%d,分:%d,秒:%d,星期:%d\n", t4.Year(), t4.Month(), t4.Day(), t4.Hour(), t4.Minute(), t4.Second(), t4.Weekday()) // 年:2018,月:5,日:23,时:21,分:9,秒:56,星期:3

    t8,err := time.Parse("2006-01-02 15:04:05", "2018-01-01 00:00:00")
    // 增加100秒,time.Duration是以纳秒为单位,time.Second=1000 000 000。参数可以为负数就是减少
    t9 := t8.Add(time.Duration(100) * time.Second)
    fmt.Println(t9) // 2018-01-01 00:01:40 +0000 UTC

    // 增加或减少年、月、日
    t10 := t8.AddDate(1, 1, -1)
    fmt.Println(t10) // 2019-01-31 00:00:00 +0000 UTC

    // 计算两个时间之间的差
    dur := t8.Sub(t9)
    fmt.Println(dur.Seconds()) // -100

    //=======================================================================定时器、休眠等
    // Timer,单次时间事件,指定时间后向通道C发送当时时间
    timer := time.NewTimer(time.Duration(1) * time.Second)
    fmt.Println(<- timer.C)

    // 也可配合select使用
    timer = time.NewTimer(time.Duration(1) * time.Second)
    select {
    case <- timer.C :
        fmt.Println("执行...")
    }

     // 用Timer实现定时器
    timer = time.NewTimer(time.Duration(1) * time.Second)
    for {
        select {
        case <- timer.C :
            fmt.Println("Timer定时器...")
            timer.Reset(time.Duration(1) * time.Second) // 重新开始计时
        }
    }

    // 开启一个新协程,在指定时间后执行给定函数,所以测试时,需要将主协程休眠几秒才能看到执行结果
    time.AfterFunc(time.Duration(1) * time.Second, func() {
        fmt.Println("AfterFunc...")
    })
    // 当前协程休眠指定时间
    time.Sleep(2 * time.Second)

    // 指定时间后向通道C发送当时时间
    tt := <- time.After(time.Duration(1) * time.Second)
    fmt.Println(tt)

    // Ticker保管一个通道,并每隔一段时间向其传递"tick"。
    ticker := time.NewTicker(time.Duration(1) * time.Second)
    // 用Ticker实现定时器
    for {
        select {
        case <-ticker.C:
            fmt.Println("Ticker...")
        }
    }

}

原文地址:http://blog.51cto.com/634435/2119633

时间: 2024-10-06 00:45:40

Go语言中时间函数及定时器的使用的相关文章

想精度高,可以考虑用c语言中的函数gettimeofday

大家好: 在 win32 + bcb 时, 有个 GetTickCount() 返回第统启动到现在的 tick, 单位 ms.请问在 Linux + qt5 怎样实现呢? 如果用 QDateTime , 精度只能到秒,而且运行过程中,如果用户改充了系统时间,就会出错了. 用QElapsedTimer. 想精度高,可以考虑用c语言中的函数gettimeofday,微秒级精度 #include <sys/time.h>int gettimeofday(struct timeval*tv, stru

【C语言学习】C语言中的函数

代码中,函数是为了更好的实现模块化的程序设计.那么函数的本质是什么?函数中定义的变量(全局变量.局部变量.静态变量等)又是怎样存储的?为什么全局变量与局部变量的作用域和生命期不相同?只有更加深入的了解函数,才能解答这些问题! ★函数的本质 函数的本质是一段可执行的机器指令代码,函数名的本质是一个标号,表示函数代码的入口.该标号的值等于内存中存储函数代码的内存空间的首地址. ★变量 ●全局变量 全局变量也就是外部变量,定义在函数的外部.因此它不属于任何一个函数,只属于所在的源文件. ▲初始化 对于

C语言的时间函数

---恢复内容开始--- 下面是C语言的获取本地时间和构造时间进行格式化时间显示输出的相关函数:This page is part of release 3.35 of the Linux man-pages project. #include <time.h> char *asctime(const struct tm *tm); char *asctime_r(const struct tm *tm, char *buf); char *ctime(const time_t *timep)

sqlserver 数据库中时间函数的建立

create function [dbo].[HtoSec](@lvalue as int)RETURNS intBEGINDECLARE @temp intSet @temp = @lvalue * 60 * 60RETURN @tempEND create function [dbo].[GetTime](@dtmValue as datetime)RETURNS intBEGINDECLARE @temp intDECLARE @GMT_TIMEZONE intSET @GMT_TIMEZ

C语言中的函数以及#include的补充说明

C语言中的函数: 函数的定义,就是一个封装的代码段,每个函数能实现不同的功能 定义函数的目的:将一个常用的共功能封装起来,方便以后调用 什么情况下需要定义函数:添加一个常用的新功能 定义函数的格式: 返回值类型 函数名(形式参数列表) { 函数体: } 形参跟实参: 形式参数:定义函数时函数名后面中的参数,简称形参 实际参数:调用函数式传入的具体数据,简称实参 实参个数必须等于形参个数 函数体内部不能定义和形参一样的变量 如果是基本数据类型作为函数形参,纯粹是值传递,修改函数内部形参的值,并不会

linux中时间函数

linux下常用时间类型有四种: time_t . struct   tm. struct  timeval .    struct   timespec 1.time_t   时间函数 time_t  类型在time.h中定义: #ifndef   __TIME__T #define  __TIME_T typedef    long  time_t #endif 可见, time_t 实际上是一个长整型,其值表示从1970年1月1日00时00分00秒(linux系统的Epoch时间)到当前时

c语言中的函数

函数注意事项在设计中:函数在设计的时候应该尽可能的单一出口或者单一入口,因为它可以让我们更加的容易读取和有关功能的分类. 1.函数的定义:函数一块代码,接受一个或者多个参数,做一件事情,并且返回0个或者多个值. 可以类比:成为数学中的函数,我们输入多个参数并且将会输出相对应的值,这其中的过程就像我们数学中的函数里面处理的过程. 2.函数定义: 返回类型 函数名 (参数,--)  //函数头 { //函数体 } eg:int sum (int first, int second) { return

c语言中重要函数

gets函数,从标准输入读取一行文本,一行输入由一串字符组成,以一个换行符结尾: gets函数丢弃换行符,并在该行的末尾存储一个NUL字符(类似'\0'), 然后返回一个非NULL值. 当gets函数被调用但事实上不存在输入行时,它返回NULL值. 注意点:给字符串分配空间加NUL的空间: 格式字符串包含格式指定符(格式代码)以及普通字符,这些普通字符将按照原样打印出来: 但每个格式指定符将使后续参数的值按照它所指定的格式打印. %d 十进制打印: %g 打印浮点值: %o 八进制打印:   %

C语言中的函数、数组与指针

1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:  函数是C语言代码的基本组成部分,它是一个小的模块,整个程序由很多个功能独立的模块(函数)组成.这就是程序设计的基本分化方法: (1) 写一个函数的关键: 函数定义:函数的定义是这个函数的实现,函数定义中包含了函数体,函数体中的代码段决定了这个函数的功能: 函数声明:函数声明也称函数原型声明,函数的原型