Golang 包01,时间 time

Posted 尚墨1111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang 包01,时间 time相关的知识,希望对你有一定的参考价值。

Golang time包

Golang 时间 time包


1 写在前面的话:

当遇到时间相关的需求,但是不知道有哪个对应的方法,并且google baidu 搜不到的情况,建议直接查看接口API文档,没准就能找到你不知道但刚好能满足需求的方法,毕竟代码的核心不是重复造轮子,当你觉得繁琐时,就是优化的时机,并且这个时机很大可能别人已经优化了


2 time包中常见的几种用法

  1. 当前时间 time.Now()
  2. 把时间格式化成字符串(time->string) : time.Now().Format("2006-01-02 15:04:05")
  3. 把日期字符串转化为时间(string -> time) : time.Parse("01-02-2006", "06-17-2013")
  4. 把纳秒转化为时间字符串(int64 -> string): time.Unix(timestamp, 0).Format("2006-01-02 15:04:05")
  5. 获取当前时间时间戳 time.Now().UnixNano()
  6. 自己组装时间 time.Date() (看下面)
  7. 时间间隔多久time.Now().Truncate(时间)
  8. 时间格式相互转化

3 详情

3.1 time.Format,时间格式化成字符串(time->string)

func (t Time) Format(layout string) string 

layout对应的符合规定的格式

Year: "2006" "06"
Month: "Jan" "January" "01" "1"
Day of the week: "Mon" "Monday"
Day of the month: "2" "_2" "02"
Day of the year: "__2" "002"
Hour: "15" "3" "03" (PM or AM)
Minute: "4" "04"
Second: "5" "05"
AM/PM mark: "PM"

3.2 time.Parse,日期字符串转化为时间(string -> time)

**Parse 解析格式化的字符串并返回它所代表的时间值。**请参阅名为 Layout 的常量的文档以了解如何表示格式。第二个参数必须可以使用作为第一个参数提供的格式字符串(布局)进行解析

// Parse parses a formatted string and returns the time value it represents. 
// layout:解析格式
// value:需要按格式解析的字符串,必须与格式对应
func Parse(layout, value string) (Time, error)

应用:

注意,并不是必须按熟悉的 2006-01-02 15:03:04 这类符合直觉的格式才可以转化,实际上,只要你需要什么样的格式都可以

// 字符串 122334 转时间
func ConvertStr2Time(str string) (time.Time, error) 
   // 获取当天的日期
   now := time.Now()
   datetimeStr := now.Local().Format("20060102") + str

   snapshotTime, err := time.Parse("20060102150405", datetimeStr)

   return snapshotTime.Local().Format("2006-01-02 15:04:05.000"), nil

3.3 时区

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

3.4 输出秒、毫秒、纳秒格式时间戳

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)

3.5 Time包格式转化

// 将自定义时间格式转化为 Time 格式
time.Time(其他格式)

文章可参考:https://www.jianshu.com/p/8ac396850a3d

package util

import (
   "cts/infra/midware/mysql"
   "strconv"
   "time"
)

// ConvertStr2Time 字符串转时间
func ConvertStr2Time(str string) (time.Time, error) 
   return time.ParseInLocation("2006-01-02 15:04:05", str, time.Local)


// ConvertTime2Str 时间转字符串
func ConvertTime2Str(time time.Time) string 
   if time.IsZero() 
      return ""
   
   return time.Local().Format("2006-01-02 15:04:05")


// ConvertTime2StrV2 时间转字符串(毫秒)
func ConvertTime2StrV2(time time.Time) string 
   return time.Local().Format("2006-01-02 15:04:05.000")


// ConvertTime2Loc 时间转为本地时间
func ConvertTime2Loc(t time.Time) (string, error) 
   loc, err := time.LoadLocation("Local")
   if err != nil 
      return "", err
   
   return t.In(loc).Format("2006-01-02 15:04:05"), nil


// ConvertStr2TimePtr str转时间
func ConvertStr2TimePtr(str string) *time.Time 
   if len(str) < 1 
      return nil
   
   t, err := time.ParseInLocation("2006-01-02 15:04:05", str, time.Local)
   if err != nil 
      return nil
   
   return &t


4 实际应用场景

4.1 时间初始化

time.Now
//通过字符串,默认UTC时区初始化Time
func Parse(layout, value string) (Time, error) 
//通过字符串,指定时区来初始化Time
func ParseInLocation(layout, value string, loc *Location) (Time, error) 

//通过unix 标准时间初始化Time
func Unix(sec int64, nsec int64) Time

4.2 自己组装时间

参考文章:https://cloud.tencent.com/developer/article/1467743

// Date()
timeEnd := time.Date(timeNow.Year(), timeNow.Month(), timeNow.Day(), 23, 59, 59, 0, time.Local)
// 除了用Date()方法,还可以结合使用parse()和Formate()生成

4.3 生成以时间为基准的Id编号

// GenDateTimeLikeId 获取当前时间生成id,示例 2022-05-24 20:08:26.052 ==> 220524200826052
func (worker idWorker) GenDateTimeLikeId() int64 
   local := time.Now().Local()
   timeStr := local.Format("060102150405.000")
   timeStr = strings.Replace(timeStr, ".", "", -1)
   id, err := strconv.ParseInt(timeStr, 10, 64)
   if err != nil 
      return 0
   
   return id

以上是关于Golang 包01,时间 time的主要内容,如果未能解决你的问题,请参考以下文章

golang的time包管理

Golang标准包time总结

Golang标准包time总结

Golang标准包time总结

golang time包相关的一些问题

golang 基准测试和性能测试总结