package utils import ( "time" "github.com/jinzhu/now" ) const ( DateISO = "2006-01-02" TimeISO = "2006-01-02 15:04:05" ) var ( LocBJ, _ = time.LoadLocation("Asia/Shanghai") ) func init() { time.Local = LocBJ } func Now() time.Time { return time.Now().Local() } func NowMillisecond() int64 { return Now().UnixNano() / int64(time.Millisecond) } func BeginOfYesterday() time.Time { t := Now().AddDate(0, 0, -1) year, month, day := t.Date() return time.Date(year, month, day, 0, 0, 0, 0, t.Location()) } func BeginOfYesterday0() time.Time { t := Now().AddDate(0, 0, -2) year, month, day := t.Date() return time.Date(year, month, day, 0, 0, 0, 0, t.Location()) } func BeginOfToday() time.Time { t := Now() year, month, day := t.Date() return time.Date(year, month, day, 0, 0, 0, 0, t.Location()) } func BeginOfHour() time.Time { t := Now() year, month, day := t.Date() return time.Date(year, month, day, t.Hour(), 0, 0, 0, t.Location()) } func EndOfToday() time.Time { t := Now() year, month, day := t.Date() return time.Date(year, month, day, 23, 59, 59, 0, t.Location()) } func BeginTodayMillsecond() int64 { return BeginOfToday().UnixNano() / int64(time.Millisecond) } // ServerCurrMillisecond 获得时间毫秒数 13位 func ServerCurrMillisecond(t time.Time) int64 { return t.UnixNano() / 1000000 } func BeginWithTime(t time.Time) time.Time { year, month, day := t.Date() return time.Date(year, month, day, 0, 0, 0, 0, t.Location()) } func BeginMonthWithTime(t time.Time) time.Time { year, month, _ := t.Date() return time.Date(year, month, 1, 0, 0, 0, 0, t.Location()) } func BeginWithTimeLocal(t time.Time) time.Time { localTime := t.Local() year, month, day := localTime.Date() return time.Date(year, month, day, 0, 0, 0, 0, time.Local) } func EndWithTime(t time.Time) time.Time { year, month, day := t.Date() return time.Date(year, month, day, 23, 59, 59, 0, t.Location()) } func IsToday(t time.Time) bool { if t.IsZero() { return false } today := Now() return t.Year() == today.Year() && t.Month() == today.Month() && t.Day() == today.Day() } // BeginningOfTomorrow 明天的开始 func BeginningOfTomorrow(t time.Time) time.Time { return BeginningOfDay(t).AddDate(0, 0, 1) } // BeginningOfDay 一天的开始 func BeginningOfDay(t time.Time) time.Time { return now.New(t).BeginningOfDay() } // StrTimeToTime 时间字符串转时间 func StrTimeToTime(strTime string) (t time.Time) { timeLayout := "2006-01-02T15:04:05-07:00" loc, _ := time.LoadLocation("Local") t, _ = time.ParseInLocation(timeLayout, strTime, loc) return } func RecentMinute(tim time.Time, scaleMinute int64) time.Time { minute := int64(tim.Minute()) lave := minute % scaleMinute formatMinute := minute - lave return time.Date(tim.Year(), tim.Month(), tim.Day(), tim.Hour(), int(formatMinute), 0, 0, tim.Location()) } var ( GlobalShardHour = time.Hour GlobalShardDay = 24 * time.Hour GlobalShardWeek = 7 * 24 * time.Hour GlobalShardMonth = 30 * 24 * time.Hour DefaultStatBeginTime, _ = time.ParseInLocation("2006-01-02", "2021-03-01", time.Local) ) type TimeSegment struct { Begin time.Time End time.Time } type TimeSegmentList []TimeSegment func CalcTimeSegments(start, end time.Time, step time.Duration) TimeSegmentList { ret := make(TimeSegmentList, 0) if start.After(end) { return ret } if start.Add(step).After(end) { ret = append(ret, TimeSegment{ Begin: start, End: end, }) return ret } b := start for b.Before(end) { e := b.Add(step) if e.After(end) { e = end } ret = append(ret, TimeSegment{Begin: b, End: e}) b = b.Add(step) } return ret } func BeginOfMonth(t time.Time) time.Time { year, month, _ := t.In(time.Local).Date() return time.Date(year, month, 1, 0, 0, 0, 0, t.Location()) } func EndOfMonth(t time.Time) time.Time { return BeginOfMonth(t).AddDate(0, 1, 0).Add(-time.Nanosecond) } func MonthDateRange(t time.Time) (string, string) { b := BeginOfMonth(t) e := EndOfMonth(t) return GetDateString(b), GetDateString(e) } func GetDateString(t time.Time) string { return t.In(LocBJ).Format(DateISO) }