后端开发总结(5):时间 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在空参时会是00-00-00 00:00:00,进行json转化时需要进行相应的转化过程,

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

// MarshalJSON for Time
func (t *NullTime) MarshalJSON() ([]byte, error) {
   if time.Time(*t).IsZero() {
      return []byte(`null`), nil
   }
   return []byte(`"` + time.Time(*t).Format("2006-01-02 15:04:05") + `"`), nil
}

文章可参考: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
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值