- 容器中的时间可能和在电脑本地的不一样。time.Now()在容器也可能获取到的是UTC时间2022-12-15 03:16:14.793008672 +0000 UTC m=+1775.212342083。在电脑本地获取的是2022-12-15 11:06:23.5031029 +0800 CST m=+0.186318401
golang 的time包里一共包含了几个类型的结构体:
- Constants :常量
- type ParseError:描述解析时间字符串时出现的错误。
- type Weekday:代表一周的某一天
- type Month:代表一年的某个月。
- type Location:代表一个(关联到某个时间点的)地点,以及该地点所在的时区。
- type Time:代表一个纳秒精度的时间点。
- type Duration:代表两个时间点之间经过的时间,以纳秒为单位。可表示的最长时间段大约290年。
- type Timer:代表单次时间事件
- type Ticker:保管一个通道,并每隔一段时间向其传递"tick"。(反复的)
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
now := time.Now() // 获取当前时间
timestamp := now.Unix() // 秒级时间戳 1658223718
milli := now.UnixMilli() // 毫秒时间戳 Go1.17+ 1658223718098
micro := now.UnixMicro() // 微秒时间戳 Go1.17+ 1658223718098170
nano := now.UnixNano() // 纳秒时间戳 1658223718098170800
fmt.Println(timestamp, milli, micro, nano)
时区
//创建时间对象需要指定位置。
//常用的位置是 time.Local(当地时间) 和 time.UTC(UTC时间)。
//timeInLocal := time.Date(2009, 1, 1, 20, 0, 0, 0, time.Local) // 系统本地时间
//北京时间(东八区)比UTC早8小时
// timezoneDemo 时区示例
func timezoneDemo() {
// 中国没有夏令时,使用一个固定的8小时的UTC时差。
// 对于很多其他国家需要考虑夏令时。
secondsEastOfUTC := int((8 * time.Hour).Seconds())
// FixedZone 返回始终使用给定区域名称和偏移量(UTC 以东秒)的 Location。
beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)
// 如果当前系统有时区数据库,则可以加载一个位置得到对应的时区
// 例如,加载纽约所在的时区
newYork, err := time.LoadLocation("America/New_York") // UTC-05:00
if err != nil {
fmt.Println("load America/New_York location failed", err)
return
}
fmt.Println()
// 加载上海所在的时区
//shanghai, err := time.LoadLocation("Asia/Shanghai") // UTC+08:00
// 加载东京所在的时区
//tokyo, err := time.LoadLocation("Asia/Tokyo") // UTC+09:00
// 创建时间对象需要指定位置。常用的位置是 time.Local(当地时间) 和 time.UTC(UTC时间)。
//timeInLocal := time.Date(2009, 1, 1, 20, 0, 0, 0, time.Local) // 系统本地时间
timeInUTC := time.Date(2009, 1, 1, 12, 0, 0, 0, time.UTC)
sameTimeInBeijing := time.Date(2009, 1, 1, 20, 0, 0, 0, beijing)
sameTimeInNewYork := time.Date(2009, 1, 1, 7, 0, 0, 0, newYork)
// 北京时间(东八区)比UTC早8小时,所以上面两个时间看似差了8小时,但表示的是同一个时间
timesAreEqual := timeInUTC.Equal(sameTimeInBeijing)
fmt.Println(timesAreEqual)
// 纽约(西五区)比UTC晚5小时,所以上面两个时间看似差了5小时,但表示的是同一个时间
timesAreEqual = timeInUTC.Equal(sameTimeInNewYork)
fmt.Println(timesAreEqual)
}
带TZ的格林威治时间字符串转时间格式
to, _ := time.Parse("2006-01-02T15:04:05Z", "2022-12-14T02:27:19.000Z")
stamp := to.Format("2006-01-02 15:04:05")
var timeLayout = "2006-01-02 15:04:05"
字符串转time.time
ts := "2022-11-08 17:25:00"
ttt ,err := time.ParseInLocation(timeLayout,ts,time.Local)
int64转time.time
ttt := time.Now().UnixMilli()
fmt.Println(ttt)
nt := int64(ttt + 10000)
fmt.Println("nt=",nt)
time.UnixMilli(nt)
将字符串日期去除时间部分(也就是时分秒)
func DateStringWipeOffTime(date string) string {
date = strings.TrimPrefix(date, " ")
date = strings.TrimSuffix(date, " ")
if strings.Contains(date, " ") {
i := strings.Index(date, " ")
date = date[:i]
return date
}
return date
}
给字符串日期加上时间部分(默认部分)
func DateStringAddTime(date string) string {
date = strings.TrimPrefix(date, " ")
date = strings.TrimSuffix(date, " ")
if strings.Contains(date, " ") {
return date
}
date = date + " 00:00:00"
return date
}
根据字符串日期获取本地时间(int64类型)
func StringToLocationInt64(date string) int64 {
loc, _ := time.LoadLocation("Local")
if strings.Contains(date, " ") {
dateTime, _ := time.ParseInLocation(timeLayout, date, loc)
dateTimeInt := dateTime.Unix()
return dateTimeInt
}
dateTime, _ := time.ParseInLocation("2006-01-02", date, loc)
dateTimeInt := dateTime.Unix()
return dateTimeInt
}
字符串日期转time.Time不要时分秒部分
func StringToDateWithOutTime(date string) string {
dateTimeInt := StringToLocationInt64(date)
result := time.Unix(dateTimeInt, 0).Format("2006-01-02")
return result
}
字符串日期转time.Time,保留时分秒部分
func StringToDateWithInTime(date string) string {
dateTimeInt := StringToLocationInt64(date)
result := time.Unix(dateTimeInt, 0).Format(timeLayout)
return result
}
日期计算,增加指定天数,不保留时分秒
func DateAddDayWhitOutTime(date string, days int) string {
dateTimeInt := int(StringToLocationInt64(date))
oneDay := 86400
addingDays := oneDay * days
dateTimeInt += addingDays
dateTimeString := time.Unix(int64(dateTimeInt), 0).Format("2006-01-02")
return dateTimeString
}
日期计算,增加指定天数,保留时分秒
func DateAddDayWhitInTime(date string, days int) string {
dateTimeInt := int(StringToLocationInt64(date))
oneDay := 86400
addingDays := oneDay * days
dateTimeInt += addingDays
dateTimeString := time.Unix(int64(dateTimeInt), 0).Format("2006-01-02 15:04:05")
return dateTimeString
}
定时器
func tickDemo() {
ticker := time.Tick(time.Second) //定义一个1秒间隔的定时器
for i := range ticker {
fmt.Println(i)//每秒都会执行的任务
}
}
使用时间排序结构体数组
type DataDo struct {
TimeStamp time.Time `json:"timeStamp"`
}
type DataDoSlice []DataDo
func (dds DataDoSlice) Len() int{
return len(dds)
}
func (dds DataDoSlice) Swap(i,j int){
dds[i],dds[j] = dds[j],dds[i]
}
//时间小到大排序
func (dds DataDoSlice) Less(i,j int) bool{
return dds[j].TimeStamp.Before(dds[i].TimeStamp)
}