122 lines
2.8 KiB
Go
122 lines
2.8 KiB
Go
package global
|
|
|
|
import (
|
|
"database/sql/driver"
|
|
"fmt"
|
|
"math"
|
|
"math/rand"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// DateTime 自定义事件类型
|
|
type DateTime time.Time
|
|
|
|
// 日期格式
|
|
const (
|
|
DateLayout = "2006-01-02"
|
|
DateTimeLayout = "2006-01-02 15:04:05"
|
|
TimeLayout = "15:04:05"
|
|
BuildTimeLayout = "2006.0102.150405"
|
|
TimestampLayout = "20060102150405"
|
|
)
|
|
|
|
var StartTime = time.Now()
|
|
|
|
func (dt *DateTime) UnmarshalJSON(data []byte) (err error) {
|
|
value := strings.Trim(string(data), "\"")
|
|
now, err := time.ParseInLocation(DateTimeLayout, value, time.Local)
|
|
*dt = DateTime(now)
|
|
return
|
|
}
|
|
|
|
func (dt DateTime) MarshalJSON() ([]byte, error) {
|
|
b := make([]byte, 0, len(DateTimeLayout)+2)
|
|
b = append(b, '"')
|
|
b = time.Time(dt).AppendFormat(b, DateTimeLayout)
|
|
b = append(b, '"')
|
|
return b, nil
|
|
}
|
|
|
|
func (dt DateTime) Value() (driver.Value, error) {
|
|
var zeroTime time.Time
|
|
ti := time.Time(dt)
|
|
if ti.UnixNano() == zeroTime.UnixNano() {
|
|
return nil, nil
|
|
}
|
|
return ti, nil
|
|
}
|
|
|
|
func (dt *DateTime) Scan(v interface{}) error {
|
|
if value, ok := v.(time.Time); ok {
|
|
*dt = DateTime(value)
|
|
return nil
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (dt DateTime) String() string {
|
|
return time.Time(dt).Format(DateTimeLayout)
|
|
}
|
|
|
|
func UpTime() time.Duration {
|
|
return time.Since(StartTime)
|
|
}
|
|
|
|
func UpTimeString() string {
|
|
d := UpTime()
|
|
days := d / (time.Hour * 24)
|
|
d -= days * 24 * time.Hour
|
|
hours := d / time.Hour
|
|
d -= hours * time.Hour
|
|
minutes := d / time.Minute
|
|
d -= minutes * time.Minute
|
|
seconds := d / time.Second
|
|
return fmt.Sprintf("%d Days %d Hours %d Mins %d Secs", days, hours, minutes, seconds)
|
|
}
|
|
|
|
// 获取时区
|
|
func GetLocation() (*time.Location, error) {
|
|
location, err := time.LoadLocation("Local")
|
|
if err != nil {
|
|
return location, nil
|
|
}
|
|
return location, nil
|
|
}
|
|
|
|
func GetDuration(t int64, v string) time.Duration {
|
|
switch v {
|
|
case "h":
|
|
return time.Hour * time.Duration(t)
|
|
case "m":
|
|
return time.Minute * time.Duration(t)
|
|
case "s":
|
|
return time.Second * time.Duration(t)
|
|
default:
|
|
return time.Minute * time.Duration(t)
|
|
}
|
|
}
|
|
|
|
func SleepRandomDuration() {
|
|
ns := int64(5) * 1000000000
|
|
// 以当前时间为随机数种子,如果所有 log-agent-updater 在同一时间启动,系统时间是相同的,那么随机种子就是一样的
|
|
// 问题不大,批量ssh去启动 log-agent-updater 的话也是一个顺次的过程
|
|
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
d := time.Duration(r.Int63n(ns)) * time.Nanosecond
|
|
time.Sleep(d)
|
|
}
|
|
|
|
// OverTimeNow 超时比较
|
|
func OverTimeNow(compareTime, subTime time.Time, sub int64) (bool, int64, error) {
|
|
location, err := GetLocation()
|
|
if err != nil {
|
|
return false, 0, err
|
|
}
|
|
subT := compareTime.In(location).Sub(subTime)
|
|
abs := int64(math.Abs(math.Ceil(subT.Minutes())))
|
|
if abs > sub {
|
|
return true, abs, nil
|
|
}
|
|
return false, abs, nil
|
|
}
|