You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
253 lines
5.5 KiB
253 lines
5.5 KiB
package gotime
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
RFC822Format = "Mon, 02 Jan 2006 15:04:05 MST"
|
|
ISO8601Format = "2006-01-02T15:04:05Z"
|
|
)
|
|
|
|
func NowUTCSeconds() int64 { return time.Now().UTC().Unix() }
|
|
|
|
func NowUTCNanoSeconds() int64 { return time.Now().UTC().UnixNano() }
|
|
|
|
// GetCurrentDate 获取当前的时间 - 字符串
|
|
func GetCurrentDate() string {
|
|
return time.Now().Format("2006/01/02 15:04:05")
|
|
}
|
|
|
|
// GetCurrentUnix 获取当前的时间 - Unix时间戳
|
|
func GetCurrentUnix() int64 {
|
|
return time.Now().Unix()
|
|
}
|
|
|
|
// GetCurrentMilliUnix 获取当前的时间 - 毫秒级时间戳
|
|
func GetCurrentMilliUnix() int64 {
|
|
return time.Now().UnixNano() / 1000000
|
|
}
|
|
|
|
// GetCurrentNanoUnix 获取当前的时间 - 纳秒级时间戳
|
|
func GetCurrentNanoUnix() int64 {
|
|
return time.Now().UnixNano()
|
|
}
|
|
|
|
// GetCurrentWjDate 获取当前的时间 - 字符串 - 没有间隔
|
|
func GetCurrentWjDate() string {
|
|
return time.Now().Format("20060102")
|
|
}
|
|
|
|
func FormatISO8601Date(timestampSecond int64) string {
|
|
tm := time.Unix(timestampSecond, 0).UTC()
|
|
return tm.Format(ISO8601Format)
|
|
}
|
|
|
|
// Pro 结构体
|
|
type Pro struct {
|
|
Time time.Time
|
|
}
|
|
|
|
// NewPro 初始化结构体
|
|
func NewPro() Pro {
|
|
return Pro{
|
|
Time: time.Now(),
|
|
}
|
|
}
|
|
|
|
// Current 获取当前的时间
|
|
func Current() Pro {
|
|
p := NewPro()
|
|
location, err := time.LoadLocation("Asia/Shanghai")
|
|
if err != nil {
|
|
// Docker部署golang应用时时区问题 https://www.ddhigh.com/2018/03/01/golang-docker-timezone.html
|
|
log.Printf("时区错误:%v\n", err)
|
|
p.Time = time.Now().Add(time.Hour * 8)
|
|
} else {
|
|
p.Time = time.Now().In(location)
|
|
}
|
|
return p
|
|
}
|
|
|
|
// SetCurrent 设置当前的时间
|
|
func SetCurrent(sTime time.Time) Pro {
|
|
p := NewPro()
|
|
p.Time = sTime
|
|
return p
|
|
}
|
|
|
|
// SetCurrentParse 设置当前的时间
|
|
func SetCurrentParse(str string) Pro {
|
|
p := NewPro()
|
|
location, _ := time.ParseInLocation("2006-01-02 15:04:05", str, time.Local)
|
|
p.Time = location
|
|
return p
|
|
}
|
|
|
|
// SetCurrentUnix 设置当前的时间 Unix时间戳
|
|
func SetCurrentUnix(ts int64) Pro {
|
|
p := NewPro()
|
|
p.Time = time.Unix(ts, 0)
|
|
return p
|
|
}
|
|
|
|
// StartOfDay 本日开始时间
|
|
func (p Pro) StartOfDay() Pro {
|
|
p.Time = time.Date(p.Time.Year(), p.Time.Month(), p.Time.Day(), 0, 0, 0, 0, p.Time.Location())
|
|
return p
|
|
}
|
|
|
|
// EndOfDay 本日结束时间
|
|
func (p Pro) EndOfDay() Pro {
|
|
p.Time = time.Date(p.Time.Year(), p.Time.Month(), p.Time.Day(), 23, 59, 59, 0, p.Time.Location())
|
|
return p
|
|
}
|
|
|
|
// BeforeSeconds 获取n秒前的时间
|
|
func (p Pro) BeforeSeconds(seconds int) Pro {
|
|
st, _ := time.ParseDuration(fmt.Sprintf("-%ds", seconds))
|
|
p.Time = p.Time.Add(st)
|
|
return p
|
|
}
|
|
|
|
// AfterSeconds 获取n秒后的时间
|
|
func (p Pro) AfterSeconds(seconds int) Pro {
|
|
st, _ := time.ParseDuration(fmt.Sprintf("+%ds", seconds))
|
|
p.Time = p.Time.Add(st)
|
|
return p
|
|
}
|
|
|
|
// BeforeHour 获取n小时前的时间
|
|
func (p Pro) BeforeHour(hour int) Pro {
|
|
st, _ := time.ParseDuration(fmt.Sprintf("-%dh", hour))
|
|
p.Time = p.Time.Add(st)
|
|
return p
|
|
}
|
|
|
|
// AfterHour 获取n小时后的时间
|
|
func (p Pro) AfterHour(hour int) Pro {
|
|
st, _ := time.ParseDuration(fmt.Sprintf("+%dh", hour))
|
|
p.Time = p.Time.Add(st)
|
|
return p
|
|
}
|
|
|
|
// BeforeDay 获取n天前的时间
|
|
func (p Pro) BeforeDay(day int) Pro {
|
|
p.Time = p.Time.AddDate(0, 0, -day)
|
|
return p
|
|
}
|
|
|
|
// AfterDay 获取n天后的时间
|
|
func (p Pro) AfterDay(day int) Pro {
|
|
p.Time = p.Time.AddDate(0, 0, day)
|
|
return p
|
|
}
|
|
|
|
// Now 返回当前时间
|
|
func (p Pro) Now() time.Time {
|
|
return p.Time
|
|
}
|
|
|
|
// Format 格式化
|
|
func (p Pro) Format() string {
|
|
return p.Time.Format("2006-01-02 15:04:05")
|
|
}
|
|
|
|
// SetFormat 格式化
|
|
func (p Pro) SetFormat(layout string) string {
|
|
return p.Time.Format(layout)
|
|
}
|
|
|
|
// Timestamp 秒级时间戳
|
|
func (p Pro) Timestamp() int64 {
|
|
return p.Time.Unix()
|
|
}
|
|
|
|
// Unix 时间戳
|
|
func (p Pro) Unix() int64 {
|
|
return p.Time.Unix()
|
|
}
|
|
|
|
// UnixNano 纳秒级时间戳
|
|
func (p Pro) UnixNano() int64 {
|
|
return p.Time.UnixNano()
|
|
}
|
|
|
|
// TimestampWithMillisecond 毫秒级时间戳
|
|
func (p Pro) TimestampWithMillisecond() int64 {
|
|
return p.Time.UnixNano() / 100
|
|
}
|
|
|
|
// Nanosecond 时间戳小数部分 单位:纳秒
|
|
func (p Pro) Nanosecond() int {
|
|
return p.Time.Nanosecond()
|
|
}
|
|
|
|
// DiffInHour 相差多少小时
|
|
func (p Pro) DiffInHour(t2 time.Time) (hour int64) {
|
|
t2.Before(p.Time)
|
|
diff := p.Time.Unix() - t2.Unix()
|
|
hour = diff / 3600
|
|
return hour
|
|
}
|
|
|
|
// DiffInHourWithAbs 相差多少小时(绝对值)
|
|
func (p Pro) DiffInHourWithAbs(t2 time.Time) (hour int64) {
|
|
p.Time.Before(t2)
|
|
diff := t2.Unix() - p.Time.Unix()
|
|
hour = diff / 3600
|
|
if hour > 0 {
|
|
return hour
|
|
}
|
|
t2.Before(p.Time)
|
|
diff = p.Time.Unix() - t2.Unix()
|
|
hour = diff / 3600
|
|
return hour
|
|
}
|
|
|
|
// DiffInMinutes 相差多少分钟
|
|
func (p Pro) DiffInMinutes(t2 time.Time) (hour int64) {
|
|
t2.Before(p.Time)
|
|
diff := p.Time.Unix() - t2.Unix()
|
|
hour = diff / 60
|
|
return hour
|
|
}
|
|
|
|
// DiffInMinutesWithAbs 相差多少分钟(绝对值)
|
|
func (p Pro) DiffInMinutesWithAbs(t2 time.Time) (hour int64) {
|
|
p.Time.Before(t2)
|
|
diff := t2.Unix() - p.Time.Unix()
|
|
hour = diff / 60
|
|
if hour > 0 {
|
|
return hour
|
|
}
|
|
t2.Before(p.Time)
|
|
diff = p.Time.Unix() - t2.Unix()
|
|
hour = diff / 60
|
|
return hour
|
|
}
|
|
|
|
// DiffInSecond 相差多少秒
|
|
func (p Pro) DiffInSecond(t2 time.Time) (hour int64) {
|
|
t2.Before(p.Time)
|
|
diff := p.Time.Unix() - t2.Unix()
|
|
hour = diff
|
|
return hour
|
|
}
|
|
|
|
// DiffInSecondWithAbs 相差多少秒(绝对值)
|
|
func (p Pro) DiffInSecondWithAbs(t2 time.Time) (hour int64) {
|
|
p.Time.Before(t2)
|
|
diff := t2.Unix() - p.Time.Unix()
|
|
hour = diff
|
|
if hour > 0 {
|
|
return hour
|
|
}
|
|
t2.Before(p.Time)
|
|
diff = p.Time.Unix() - t2.Unix()
|
|
hour = diff
|
|
return hour
|
|
}
|