当前位置: 首页 > news >正文

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

    // 将时间戳转成Time对象,第一个参数为秒,第二个参数为纳秒,如果传秒数,则纳秒传入0;如果传入纳秒,则秒传入0
    t11 := time.Unix(0, timestamp);
    fmt.Println(t11.Format("2006-01-02 15:04:05"))

    //=======================================================================定时器、休眠等
    // 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...")
        }
    }

}

转载于:https://blog.51cto.com/634435/2119633

相关文章:

  • react——jsx源码解析
  • 拿Proxy可以做哪些有意思的事儿
  • centos7 安装 rabbitmq
  • 如何快速学习Java?
  • SylixOS write 0字节问题
  • 理解Android 中的启动模式
  • 深入理解jvm jdk1,7(5)
  • 学会python可以上天!20行代码获取斗鱼平台房间数据,就是这么牛逼!
  • Golang 多goroutine异步通知error的一种方法
  • 前端base64加密
  • 关于kettle,表输入postgres中有jsonb字段的处理
  • Mybatis架构设计及源码分析-mapper.xml文件解析
  • AGC005 补题小结
  • Video.js的简单使用介绍
  • Bootstrap Table的 文本内容 垂直居中
  • echarts花样作死的坑
  • java2019面试题北京
  • JavaScript异步流程控制的前世今生
  • Just for fun——迅速写完快速排序
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • PHP 的 SAPI 是个什么东西
  • spring security oauth2 password授权模式
  • Spring框架之我见(三)——IOC、AOP
  • uni-app项目数字滚动
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 关于Java中分层中遇到的一些问题
  • 计算机常识 - 收藏集 - 掘金
  • 前端js -- this指向总结。
  • 巧用 TypeScript (一)
  • 如何编写一个可升级的智能合约
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​ssh免密码登录设置及问题总结
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #define用法
  • (1)(1.11) SiK Radio v2(一)
  • (C语言)共用体union的用法举例
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (LeetCode C++)盛最多水的容器
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (论文阅读11/100)Fast R-CNN
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (转)http协议
  • ***原理与防范
  • **CI中自动类加载的用法总结
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET关于 跳过SSL中遇到的问题
  • .net开发引用程序集提示没有强名称的解决办法
  • .net中生成excel后调整宽度
  • @Autowired和@Resource装配
  • @Import注解详解
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [202209]mysql8.0 双主集群搭建 亲测可用