使用time包处理时间戳和日期时间字符串

package main

import (
   "fmt"
   "time"
)

// 重要提醒:Go并没有全局设置时区的功能,所以每次调用time包的函数必须调用In()设置时区或传入时区参数。
var location, _ = time.LoadLocation("Asia/Shanghai")

// GetTimeStamp
// @description 获取当前时间戳(秒级)
// @return int64  时间戳(秒级)
func GetTimeStamp() int64 {
   return time.Now().In(location).Unix()
}

// GetDateTime
// @description 获取当前时间的日期时间字符串
// @param format string 日期时间字符串格式:示例值:"2006-01-02 15:04:05"
// @return string 日期时间字符串
func GetDateTime(format string) string {
   return time.Unix(time.Now().In(location).Unix(), 0).In(location).Format(format)
}

// StringToTime
// @description 日期时间字符串转时间戳
// @param dateTime string 日期时间字符串
// @return int64 时间戳
func StringToTime(dateTime string) int64 {
   t, _ := time.ParseInLocation(time.DateTime, dateTime, location)
   return t.Unix()
}

// TimeToString
// @description 时间戳转日期时间字符串
// @param timeStamp int64 时间戳
// @return string 日期时间字符串
func TimeToString(timeStamp int64) string {
   return time.Unix(timeStamp, 0).In(location).Format(time.DateTime)
}

func main() {
   fmt.Printf("当前时间戳(秒,second)      :%v \n", time.Now().In(location).Unix())      // 10位数字
   fmt.Printf("当前时间戳(毫秒,millisecond):%v \n", time.Now().In(location).UnixMilli()) // 13位数字
   fmt.Printf("当前时间戳(微秒,microsecond):%v \n", time.Now().In(location).UnixMicro()) // 16位数字
   fmt.Printf("当前时间戳(纳秒,nanosecond) :%v \n", time.Now().In(location).UnixNano())  // 19位数字

   fmt.Printf("当前年:%v \n", time.Now().In(location).Year())
   fmt.Printf("当前月:%v \n", time.Now().In(location).Month()) // 注:不是数字,而是月份英文,示例:December
   fmt.Printf("当前日:%v \n", time.Now().In(location).Day())
   fmt.Printf("当前时:%v \n", time.Now().In(location).Hour())
   fmt.Printf("当前分:%v \n", time.Now().In(location).Minute())
   fmt.Printf("当前秒:%v \n", time.Now().In(location).Second())
   fmt.Printf("当前纳秒:%v \n", time.Now().In(location).Nanosecond()) // 注:纳秒就是纳秒级时间戳的最后9位数字
   fmt.Printf("当前星期:%v \n", time.Now().In(location).Weekday())    // 注:不是数字,而是星期几英文,示例:Saturday

   fmt.Printf("当前时间戳(秒):%v \n", GetTimeStamp())
   fmt.Printf("当前日期时间:%v \n", GetDateTime(time.DateTime))

   fmt.Printf("3天前的日期时间:%v \n", time.Now().In(location).AddDate(0, 0, -3).Format(time.DateTime))
   fmt.Printf("3天后的日期时间:%v \n", time.Now().In(location).AddDate(0, 0, 3).Format(time.DateTime))

   // 时间戳转日期时间字符串和Time对象
   timeStamp := int64(1218154088)
   dateTime := TimeToString(timeStamp)
   timeObject := time.Unix(timeStamp, 0)
   fmt.Printf("%v <=> %v \n", timeStamp, dateTime)   // 1218154088 <=> 2008-08-08 08:08:08
   fmt.Printf("%v <=> %v \n", timeStamp, timeObject) // 1218154088 <=> 2008-08-08 08:08:08 +0800 CST

   // 日期时间字符串转时间戳
   dateTime = "2008-08-08 08:08:08"
   timeStamp = StringToTime(dateTime)
   fmt.Printf("%v <=> %v \n", dateTime, timeStamp) // 2008-08-08 08:08:08 <=> 1218154088
}

// ========== 总结 ==========//
// 1、Go语言的日期时间格式字符串不是“yyyy-MM-dd HH:mm:ss”的形式,而是“2006-01-02 15:04:05”这种形式,虽然看起有点奇怪,但
//    在Go语言中就是这么用的。开发者并不需要特意记住这串字符串,Go语言内置了常用格式字符串的常量:
//    time.DateTime === "2006-01-02 15:04:05"
//    time.DateOnly === "2006-01-02"

Copyright © 2024 码农人生. All Rights Reserved