专栏首页golang+phpgolang time相关总结

golang time相关总结

前言

我们在php中对于时间操作主要是用时间戳和时间格式相互转换来计算,一般都是用时间戳进行计算,用时间格式进行展示,相对来说还是比较方便的。在golang中是有些区别的,主要是多了一个time对象,接下来我们来看一看

获取当前时间对象

在golang中,我们常用time.Now()来获取当前的时间

now := time.Now()  //时间对象
fmt.Println(now)
******************
打印结果
2020-07-07 11:12:48.795021 +0800 CST m=+0.000757041

而且我们可以根据时间对象获取当前的年月日时分秒

year := now.Year()
month := now.Month()
day := now.Day()
hour := now.Hour()
minute := now.Minute()
second := now.Second()
fmt.Println(year, month, day, hour, minute , second)
fmt.Printf("%d-%d-%d %d:%d:%d\n", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())

**************************
打印结果
2020 July 7 16 56 45
2020-7-7 16:56:45

时间戳相关

获取当前时间戳(毫秒和纳秒)

timestamp1 := now.Unix()
timestamp2 := now.UnixNano()  //纳秒
fmt.Println(timestamp1, timestamp2)
*****************
打印结果
1594091568      1594091568795021000

把指定的时间戳转换为时间对象

t := time.Unix(1593654704, 0)  //第二个参数为纳秒,一般都写0
fmt.Println(t)
***********
打印结果
2020-07-02 09:51:44 +0800 CST

时间格式化

在咱们了解时间格式化之前,一定要记住这个时间 2006-01-02 15:04:05 这个时间据说是golang的上线时间,所有时间都依据于这个 其实也很好记 2006年 12345 3是24小时制的 就可以了

timeFormat := now.Format("2006.01.02::15.04.05")
timeFormat2 := now.Format("2006.01.02::03.04.05 PM")
fmt.Println(timeFormat)
fmt.Println(timeFormat2)
*********输出结果
2020.07.07::14.42.37
2020.07.07::02.42.37 PM

解析字符串类型的时间

timeStr :="2020/07/02 14:00:00"
    loc, err := time.LoadLocation("Asia/Shanghai")
    if err != nil{
        fmt.Println("err:", err)
        return
    }
    timeObj1, err := time.Parse("2006/01/02 15:04:05", timeStr)
    if err != nil{
        fmt.Println("err :", err)
        return
    }
    timeObj2, err := time.ParseInLocation("2006/01/02 15:04:05", timeStr, loc)
    if err != nil{
        fmt.Println("err :", err)
        return
    }
    fmt.Println(timeObj1)
    fmt.Println(timeObj2)
*******输出
2020-07-02 14:00:00 +0000 UTC
2020-07-02 14:00:00 +0800 CST

其他时间相关函数

时间间隔

n := time.Duration(2)
time.Sleep(n*time.Second)

时间加减操作

now := time.Now()       // 当前 datetime时间
tomorrow := now.AddDate(0, 0, +1)   // 一天之后的时间  三个参数分别为  年 月  日
fmt.Println(tomorrow)
day_after_15 := now.AddDate(0, 0, -15)  // 15天之前的时间
fmt.Println(day_after_15)
**********输出结果
2020-07-08 17:31:56.433365 +0800 CST
2020-06-22 17:31:56.433365 +0800 CST
now := time.Now()       // 当前 datetime时间
// 10分钟前
m, _ := time.ParseDuration("-10m")
m1 := now.Add(m)
fmt.Println(m1)

// 8个小时前
h, _ := time.ParseDuration("-1h")
h1 := now.Add(8 * h)
fmt.Println(h1)

// 一天前
d, _ := time.ParseDuration("-24h")
d1 := now.Add(d)
fmt.Println(d1)

subM := now.Sub(m1)
fmt.Println(subM.Minutes(), "分钟")

sumH := now.Sub(h1)
fmt.Println(sumH.Hours(), "小时")

sumD := now.Sub(d1)
fmt.Printf("%v 天\n", sumD.Hours()/24)
************输出结果
2020-07-07 17:58:55.322775 +0800 CST m=+0.000879113
2020-07-07 17:48:57.325396 +0800 CST m=-597.996547788
2020-07-07 09:58:57.325396 +0800 CST m=-28797.996547788
2020-07-06 17:58:57.325396 +0800 CST m=-86397.996547788
10 分钟
8 小时
1 天

时间戳和时间格式之间的转换

在php中我们一般可以直接转换,golang中需要先把各自转换为时间对象,然后再转换成对应的类型

格式化时间显示

 // 获取当前时间,进行格式化

    fmt.Println(time.Now().Format("2006-01-02 15:04:05"))

    // output: 2016-07-27 08:57:46


    // 时间戳转换为时间格式
方法1:
  先把时间转换为时间对象  time.Unix(1469579899, 0)  然后再Format成时间格式
    fmt.Println(time.Unix(1469579899, 0).Format("2006-01-02 15:04:05"))

    // output: 2016-07-27 08:38:19

方法2:
// 获取指定时间戳的年月日,小时分钟秒
    t := time.Unix(1469579899, 0)
    fmt.Printf("%d-%d-%d %d:%d:%d\n", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second())
    // output: 2016-7-27 8:38:19

时间字符串转时间戳

// 先用time.Parse对时间字符串进行分析,如果正确会得到一个time.Time对象
// 后面就可以用time.Time对象的函数Unix进行获取

t2, err := time.Parse("2006-01-02 15:04:05", "2016-07-27 08:46:15")
  if err != nil {
        log.Fatalln(err)
   }
   fmt.Println(t2)
   fmt.Println(t2.Unix())

    // output:

    //     2016-07-27 08:46:15 +0000 UTC

    //     1469609175

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • php7的zval相关介绍

    zval主要由value u1 和u2保存 value占8字节,u1和u2各占4个字节 _zend_value的结构如下:

    程序员养成日记
  • redis的list类型(链表结构)

    作用: 在key链表中寻找’search’,并在search值之前|之后,.插入value

    程序员养成日记
  • 绝对能让你彻底明白的Redis的内存淘汰策略

    在 redis 中,对于已经过期的数据,Redis 采用两种策略来处理这些数据,分别是惰性删除和定期删除

    程序员养成日记
  • Win8是如何引导你把文件同步至美国的

    近日,一则名为《中央政府采购禁Win8原因:文件会同步至美国》的新闻在各大媒体广泛传播,虽然FB情报组小编的电脑也是Win8,不过秉着还原场景的原则我们来体验一...

    FB客服
  • Java组合模式(Composite)

      把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象.

    用户4919348
  • 关于mysql字段名和保留字冲突的问题 原

    Text-to-speech function is limited to 200 characters

    botkenni
  • 2016.01.05 HTML5真题练习

    HTML5学堂:每天一道题,强壮程序员!今日主要涉及01.04日关于Date对象的题目解答,以及一道涉及数组转换成字符串操作的题目。 HTML5真题【2016....

    HTML5学堂
  • 程序员面试金典 - 面试题 01.08. 零矩阵

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zero-matrix-lcci 著作权归领扣网络所...

    Michael阿明
  • Spring IOC 源码解析(下)

    上一步创建了BeanFactory,并将BeanDefinition注册到了BeanFactory中的ConcurrentHashMap中了。并且以BeanNa...

    黑洞代码
  • k8s基本原理

    前面hello world程序中,对于如何访问到服务,有必要了解一下k8s的网络模型,在这之前先介绍docker的网络模型

    kinnylee

扫码关注云+社区

领取腾讯云代金券