package types import ( "time" ) // 格式化 const ( FormatDate = "2006-01-02" FormatDatetime = "2006-01-02 15:04:05" ) // Location 本地時區 var Location = time.Local // SetLocation 設定時區 func SetLocation(name string) { Location, _ = time.LoadLocation(name) } // Timestamp 時間戳 type Timestamp int64 // GetUnixNow 取得現在時間戳記 func GetUnixNow() Timestamp { return Timestamp(time.Now().Unix()) } // GetUnixMilliNow 取得現在時間戳記 func GetUnixMilliNow() Timestamp { return Timestamp(time.Now().UnixMilli()) } // GetUnix 嘗試取得時間戳記 func GetUnix(format, datetime string) (Timestamp, error) { t, err := time.ParseInLocation(format, datetime, Location) return Timestamp(t.Unix()), err } // MustGetUnix 強制取得時間戳記 func MustGetUnix(format, datetime string) Timestamp { t, _ := GetUnix(format, datetime) return t } // Int64 轉為64位元整數 func (t Timestamp) Int64() int64 { return int64(t) } // Time 轉為time類型 func (t Timestamp) Time() time.Time { return time.Unix(t.Int64(), 0) } // TimeMilli 轉為time類型 func (t Timestamp) TimeMilli() time.Time { return time.UnixMilli(t.Int64()) } // Date 回傳日期字串 func (t Timestamp) Date() string { if t == 0 { return "" } return time. Unix(t.Int64(), 0). In(Location). Format(FormatDate) } // Datetime 回傳時間字串 func (t Timestamp) Datetime() string { if t == 0 { return "" } return time. Unix(t.Int64(), 0). In(Location). Format(FormatDatetime) } // Since 與現在的時間差 func (t Timestamp) Since() time.Duration { return time.Since(t.Time()) } // SinceMilli 與現在的時間差 func (t Timestamp) SinceMilli() time.Duration { return time.Since(t.TimeMilli()) } // Sub 時間差 func (t Timestamp) Sub(t2 time.Time) time.Duration { return t2.Sub(t.Time()) } // SubMilli 時間差 func (t Timestamp) SubMilli(t2 time.Time) time.Duration { return t2.Sub(t.TimeMilli()) } // After 是否在指定時間後 func (t Timestamp) After(t2 time.Time) bool { return t.Time().After(t2) } // AfterMilli 是否在指定時間後 func (t Timestamp) AfterMilli(t2 time.Time) bool { return t.TimeMilli().After(t2) } // AfterNow 是否在目前時間後 func (t Timestamp) AfterNow() bool { return t.After(time.Now()) } // AfterMilliNow 是否在目前時間後 func (t Timestamp) AfterMilliNow() bool { return t.AfterMilli(time.Now()) }