package timehelper import ( "fmt" "go-admin/pkg/utility" "strings" "time" ) const ( DATEFORMAT = "2006-01-02" TIMEFORMAT = "2006-01-02 15:04:05" MONTHFORMAT = "2006-01" DATETIMEFORMAT = "2006-01-02 15:04" TimeNil = "1900-01-01 00:00:00" DefaultUnix = -62135596800 // 时间戳默认初始值 ) // GetDateUnixDate 返回带毫秒的时间戳,如果需要转化为时间类型time, // 不带毫秒的:time.Unix(1663315884651/1000,0), // 带毫秒的time.Unix(1663315884651/1000, 1000000*(1663315884651%1000)) func GetDateUnixDate(date time.Time) int64 { return date.UnixMilli() } func ConvertTimeLocalSec(date int64) time.Time { d1 := time.Unix(date/1000, 1000000*(date%1000)) d2 := time.Date(d1.Year(), d1.Month(), d1.Day(), d1.Hour(), d1.Minute(), d1.Second(), d1.Nanosecond(), time.Local) return d2 } // TimeSubDays 时间间隔天数 func TimeSubDays(t1, t2 time.Time) int { if t1.Location().String() != t2.Location().String() { return -1 } hours := t1.Sub(t2).Hours() if hours <= 0 { return -1 } // sub hours less than 24 if hours < 24 { // may same day t1y, t1m, t1d := t1.Date() t2y, t2m, t2d := t2.Date() isSameDay := (t1y == t2y && t1m == t2m && t1d == t2d) if isSameDay { return 0 } return 1 } // equal or more than 24 if (hours/24)-float64(int(hours/24)) == 0 { // just 24's times return int(hours / 24) } // more than 24 hours return int(hours/24) + 1 } // ConvertTimeLocal s func ConvertTimeLocal(d1 time.Time) time.Time { d2 := time.Date(d1.Year(), d1.Month(), d1.Day(), d1.Hour(), d1.Minute(), d1.Second(), 0, time.Local) return d2 } // ConvertTimeLocalLong 转本地时间戳输出 func ConvertTimeLocalLong(d1 time.Time) int64 { d2 := time.Date(d1.Year(), d1.Month(), d1.Day(), d1.Hour(), d1.Minute(), d1.Second(), 0, time.Local) return d2.Unix() } // ConvertTimeDayLocal s func ConvertTimeDayLocal(d1 time.Time) time.Time { d2 := time.Date(d1.Year(), d1.Month(), d1.Day(), 0, 0, 0, 0, time.Local) return d2 } // // ToTimeHour 转为时分秒 // func ToTimeHour(ltime int64) string { // now := IntToTime(ltime) // return now.Format("15:04:05") // } // ParseTimeStrInLocal 从时间字符串解析时间,默认 当前时间 func ParseTimeStrInLocal(timeStr string, defaultT ...time.Time) time.Time { t, err := time.ParseInLocation(TIMEFORMAT, timeStr, time.Local) if err != nil { if len(defaultT) > 0 { return defaultT[0] } return time.Now() } return t } // IntToTime 时间戳转为时间类型 func IntToTime(intime int64) time.Time { return time.Unix(intime/1000, 0) } func Int64ToTime(in int64) time.Time { return time.Unix(in, 0) } // GetPastDay 当前时间算起,过去num天内的开始日期、结束日期 func GetPastDay(num int) (start, end time.Time) { tn := time.Now() // 当前时间,天数为单位 nowday := time.Date(tn.Year(), tn.Month(), tn.Day(), 0, 0, 0, 0, time.Local) // 过去30天 oldTime := nowday.AddDate(0, 0, -num) return oldTime, nowday } // ConvertTimeToString 格式时间,返回前台,yyyy-mm-dd hh:mm:ss func ConvertTimeToString(t time.Time) string { return t.Format("2006-01-02 15:04:05") } // ConvertTimeToStringMin 格式时间,返回前台,yyyy-mm-dd hh:mm:ss func ConvertTimeToStringMin(t time.Time) string { return t.Format("2006-01-02 15:04") } // ConvertTimeToStringDay 格式时间,返回前台,yyyy-mm-dd func ConvertTimeToStringDay(t time.Time) string { return t.Format("2006-01-02") } // ConvertTimeToString2 格式时间,返回前台,yyyy.mm.dd hh:mm 2020.06.02 17:50 func ConvertTimeToString2(t time.Time) string { return t.Format("2006.01.02 15:04") } // ConvertTimeTostringYear 格式时间,返回前台,mm-dd yyyy func ConvertTimeTostringYear(s time.Time) string { return s.Format("01-02 2006") } func Time2TimeStampMilli(s time.Time) string { return utility.Int64ToString(s.UnixMilli()) } // GetWeeHours 返回若干天后的凌晨时间戳 若day=0 则返回当天凌晨的时间 // var cstSh, _ = time.LoadLocation("Asia/Shanghai") //上海时区 func GetWeeHours(day int) time.Time { t := time.Now() // 当前时间 OnHour := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) return OnHour.AddDate(0, 0, day) // 另一种写法 // return uint(time.Date(t.Year(), t.Month(), t.Day()+day, 0, 0, 0, 0, t.Location()).Unix()) } // GetMonths 返回若干月后的凌晨时间戳 若months=0 则返回当月凌晨的时间 func GetMonths(months int) time.Time { t := time.Now() // 当前时间 OnHour := time.Date(t.Year(), t.Month(), 0, 0, 0, 0, 0, t.Location()) return OnHour.AddDate(0, months, 0) } func GetTimeFromStrDate(date string) (year, month, day int) { d, err := time.Parse(DATEFORMAT, date) if err != nil { fmt.Println("出生日期解析错误!") return 0, 0, 0 } year = d.Year() month = int(d.Month()) day = d.Day() return } func GetAge(year int) (age int) { if year <= 0 { age = -1 } nowyear := time.Now().Year() age = nowyear - year return } // GetWeekDayByNum 根据输入的数字日期返回周XX,字符串隔开的 (0,1,2,3) func GetWeekDayByNum(weeks string, lang string) []string { var result []string if len(weeks) == 0 { return result } weeks = strings.TrimRight(weeks, ",") arr := strings.Split(weeks, ",") weekMap := map[string]string{} switch lang { case "zh-CN": weekMap = map[string]string{ "0": "周日", "1": "周一", "2": "周二", "3": "周三", "4": "周四", "5": "周五", "6": "周六", } case "zh-HK": weekMap = map[string]string{ "0": "周日", "1": "週一", "2": "週二", "3": "週三", "4": "週四", "5": "週五", "6": "週六", } case "jp": weekMap = map[string]string{ "0": "日曜日", "1": "月曜日", "2": "火曜日", "3": "水曜日", "4": "木曜日", "5": "金曜日", "6": "土曜日", } case "kr": weekMap = map[string]string{ "0": "일요일", "1": "월요일", "2": "화요일", "3": "수요일", "4": "목요일", "5": "금요일", "6": "토요일", } default: weekMap = map[string]string{ "0": "Sunday", "1": "Monday", "2": "Tuesday", "3": "Wednesday", "4": "Thursday", "5": "Friday", "6": "Saturday", } } for _, a := range arr { if value, ok := weekMap[a]; ok { result = append(result, value) } } return result } // 时间差计算 func GetDateSub(begin time.Time, end time.Time) time.Duration { begin1 := GetDateFormat(begin) end1 := GetDateFormat(end) return end1.Sub(begin1) } // GetDateFormat 格式化日期用来计算时间差 func GetDateFormat(date time.Time) time.Time { return time.Date(date.Year(), date.Month(), date.Day(), date.Hour(), date.Minute(), date.Second(), 0, time.UTC) } // 本周一 func ThisWeek1() time.Time { // w1 = today - (Weekday+6)%7 today := time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(), 0, 0, 0, 0, time.Local) factor := time.Duration((today.Weekday()+6)%7) * 24 * time.Hour return today.Add(-factor) } // 本月 1号 func ThisMonthD1() time.Time { // d1 = today - day - 1 today := time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(), 0, 0, 0, 0, time.Local) factor := time.Duration(today.Day()-1) * 24 * time.Hour return today.Add(-factor) } // 近 xx 天 func Latest7Day(day int) time.Time { today := time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(), 0, 0, 0, 0, time.Local) return today.Add(-(time.Duration(day)) * 24 * time.Hour) } func LatestMonth(num int) time.Time { today := time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(), 0, 0, 0, 0, time.Local) return today.AddDate(0, -num, 0) } // 近 30 天 func Latest30Day() time.Time { today := time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(), 0, 0, 0, 0, time.Local) return today.Add(-30 * 24 * time.Hour) } func YMDUnix(t time.Time) int64 { return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()).Unix() }