golang date time, 日期, 时间
创建一个指定时间的日期对象
| 1
 | start := time.Date(2021, 1, 7, 12, 0, 0, 0, time.Local)
 | 
比较
先把当前时间格式化成相同格式的字符串, 然后使用 time 的 Before, After, Equal 方法即可.
| 1
2
3
4
5
6
7
8
9
 | time1 := "2015-03-20 08:50:29"
time2 := "2015-03-21 09:04:25"
//先把时间字符串格式化成相同的时间类型
t1, err := time.Parse("2006-01-02 15:04:05", time1)
t2, err := time.Parse("2006-01-02 15:04:05", time2)
if err == nil && t1.Before(t2) {
    //处理逻辑
    fmt.Println("true")
}
 | 
duration 比较
| 1
2
3
4
 | func minDuration(a, b time.Duration) time.Duration {
    if a <= b { return a }
    return b
}
 | 
layout
| 1
2
3
4
5
6
7
 | # 时区
2006-01-02T15:04:05Z07:00
2006-01-02T15:04:05Z
Mon, 2 Jan 2006 15:04:05 MST
20060102150405.000
# 毫秒
2006-02-01 15:04:05.000
 | 
unix nano > time
| 1
2
3
 | unixnano:=int64(1570603226000000000)
t:=time.Unix(0,unixnano)
fmt.Println(t)
 | 
毫秒, get microsecond, mill second
| 1
 | time.Now().UnixNano() / int64(time.Millisecond)
 | 
| 1
2
3
4
5
6
 | func main() {
    fmt.Printf("时间戳 (秒) : %v;\n", time.Now().Unix())
    fmt.Printf("时间戳 (纳秒) : %v;\n",time.Now().UnixNano())
    fmt.Printf("时间戳 (毫秒) : %v;\n",time.Now().UnixNano() / 1e6)
    fmt.Printf("时间戳 (纳秒转换为秒) : %v;\n",time.Now().UnixNano() / 1e9)
}
 | 
days between two dates, 计算时间差
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 | func main() {
    // The leap year 2016 had 366 days.
    t1 := Date(2016, 1, 1)
    t2 := Date(2017, 1, 1)
    days := t2.Sub(t1).Hours() / 24
    fmt.Println(days) // 366
}
func Date(year, month, day int) time.Time {
    return time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC)
}
 | 
date > string
| 1
2
3
4
5
 | // 格式化日期 - RFC3339
time.Now().Format("2006-01-02T15:04:05Z07:00")
time.Now().Format("2006-01-02-15-04-05")
time.Now().Format("2006-01-02 15:04:05")
time.Now().Format("2006-1-2 15:4:5")
 | 
| 1
2
3
4
5
6
7
 | format:="2006-01-02 15:04:05"
fmt.Println(time.Now().Format(format))
// 一天前
    d, _ := time.ParseDuration("-24h")
    d1 := now.Add(d)
    fmt.Println(d1)
 | 
string > date
在windows下,time.Parse()的时区和time.Format()的时区是一致的。
但是在linux环境下,time.Parse()的默认时区是UTC,time.Format()的时区默认是本地, 使用ParseInLocation 解决时区问题
| 1
2
 | tm2, _ := time.Parse("01/02/2006", "02/08/2015")
localTime, err := time.ParseInLocation("2006-01-02 15:04:05", "2017-12-03 22:01:02", time.Local)
 | 
时区
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
 |  now := time.Now()
    local1, err1 := time.LoadLocation("") //等同于"UTC"
    if err1 != nil {
        fmt.Println(err1)
    }
    local2, err2 := time.LoadLocation("Local")//服务器上设置的时区
    if err2 != nil {
        fmt.Println(err2)
    }
    local3, err3 := time.LoadLocation("America/Los_Angeles")
    if err3 != nil {
        fmt.Println(err3)
    }
    fmt.Println(now.In(local1))
    fmt.Println(now.In(local2))
    fmt.Println(now.In(local3))
    //output:
    //2016-12-04 07:39:06.270473069 +0000 UTC
    //2016-12-04 15:39:06.270473069 +0800 CST
    //2016-12-03 23:39:06.270473069 -0800 PST
 | 
时间计算
| 1
2
3
4
5
6
7
8
9
 | // 计算时间
// 一个小时之前
h, _ := time.ParseDuration("-1h")
start := time.Now().Add(h)
// 7 天前
h, _ := time.ParseDuration(fmt.Sprintf("%dh", 7*24))
endTime := time.Now().Add(h)
ruleEndTime := endTime.Format("15:04 2006/01/02")
 | 
https://github.com/jemygraw/TechDoc/blob/master/Go%E7%A4%BA%E4%BE%8B%E5%AD%A6/Go%20%E6%97%B6%E9%97%B4%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%92%8C%E8%A7%A3%E6%9E%90.markdown
Go 时间格式化和解析
Go使用模式匹配的方式来支持日期格式化和解析。
package main
import “fmt”
import “time”
func main() {
p := fmt.Println
// Format 函数使用一种基于示例的模式匹配方式,
// 它使用已经格式化的时间模式来决定所给定参数
// 的输出格式
p(t.Format("3:04PM"))
p(t.Format("Mon Jan _2 15:04:05 2006"))
p(t.Format("2006-01-02T15:04:05.999999-07:00"))
// 对于纯数字表示的时间来讲,你也可以使用标准
// 的格式化字符串的方式来格式化时间
fmt.Printf("%d-%02d-%02dT%02d:%02d:%02d-00:00\n",
    t.Year(), t.Month(), t.Day(),
    t.Hour(), t.Minute(), t.Second())
// 时间解析也是采用一样的基于示例的方式
withNanos := "2006-01-02T15:04:05.999999999-07:00"
t1, e := time.Parse(
    withNanos,
    "2012-11-01T22:08:41.117442+00:00")
p(t1)
kitchen := "3:04PM"
t2, e := time.Parse(kitchen, "8:41PM")
p(t2)
// Parse将返回一个错误,如果所输入的时间格式不对的话
ansic := "Mon Jan _2 15:04:05 2006"
_, e = time.Parse(ansic, "8:41PM")
p(e)
// 你可以使用一些预定义的格式来格式化或解析时间
p(t.Format(time.Kitchen))
}
运行结果
2014-03-03T22:39:31+08:00
10:39PM
Mon Mar 3 22:39:31 2014
2014-03-03T22:39:31.647077+08:00
2014-03-03T22:39:31-00:00
2012-11-01 22:08:41.117442 +0000 +0000
0000-01-01 20:41:00 +0000 UTC
parsing time “8:41PM” as “Mon Jan _2 15:04:05 2006”: cannot parse “8:41PM” as “Mon”
10:39PM
字符串毫秒转时间格式
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 | package main
import (
    "fmt"
    "strconv"
    "time"
)
func main() {
    fmt.Println(msToTime("1489582166978"))
}
func msToTime(ms string) (time.Time, error) {
    msInt, err := strconv.ParseInt(ms, 10, 64)
    if err != nil {
        return time.Time{}, err
    }
    tm := time.Unix(0, msInt*int64(time.Millisecond))
    fmt.Println(tm.Format("2006-02-01 15:04:05.000"))
    return tm, nil
}
 | 
https://blog.csdn.net/CodyGuo/article/details/53009451
https://www.kancloud.cn/itfanr/go-by-example/81698
https://yourbasic.org/golang/days-between-dates/
https://programming.guide/go/format-parse-string-time-date-example.html
https://www.jianshu.com/p/92d9344425a7
https://zhuanlan.zhihu.com/p/31829454