package publicmethod import ( "appNewPlatform/appConstant" "appNewPlatform/utils/snowflake" "crypto/md5" "crypto/rand" "crypto/sha1" "encoding/hex" "errors" "fmt" "math" "math/big" "reflect" "strconv" "strings" "time" "gorm.io/gorm" ) //公共方法 // 编号,纯数字 func TableNumber(class ...string) (number int64) { result, _ := rand.Int(rand.Reader, big.NewInt(8999)) numberTeam := result.Int64() + 1000 numberStr := fmt.Sprintf("%v%v", time.Now().Unix(), numberTeam) if len(class) > 0 { resultLong, _ := rand.Int(rand.Reader, big.NewInt(8999999)) numberTeamLong := resultLong.Int64() + 1000000 numberStr = fmt.Sprintf("%v%v", time.Now().Unix(), numberTeamLong) } number, _ = strconv.ParseInt(numberStr, 10, 64) return } // 获取UUID func GainUUID(workId int64) (uuid int64) { flake, err := snowflake.NewWorker(workId) if err != nil { uuid = TableNumber() } else { uuid = flake.GetId() } return } // 获取随机数 func GetRandNumber(max int) (num int64) { maxVal := int64(math.Pow10(max)) - 1 minVal := int64(math.Pow10(max - 1)) // fmt.Printf("max:%v\nmaxVal:%v\nminVal:%v\n", max, maxVal, minVal) if maxVal < 1 { maxVal = 9 } if minVal < 1 { minVal = 1 } result, _ := rand.Int(rand.Reader, big.NewInt(int64(maxVal))) num = result.Int64() + int64(minVal) return } // 初始化map(泛型) func MapOut[T GenericityVariable]() (data map[T]interface{}) { data = make(map[T]interface{}) //必可不少,分配内存 return data } // 时间戳转换成time格式 func TimeUnixToTime(timeData int64, unit string) (res time.Time) { timeStr := UnixTimeToDay(timeData, 11) loc, _ := time.LoadLocation("Local") layout, ok := timeLayoutMap[unit] if !ok { layout = timeLayoutMap["s"] } res, _ = time.ParseInLocation(layout, timeStr, loc) return } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:06:03 @ 功能: 日期字符串转换成time格式 */ func StringToTimeIng(unit, str string) (res time.Time) { loc, _ := time.LoadLocation("Local") // str := t.ToString() layout, ok := timeLayoutMap[unit] if !ok { layout = timeLayoutMap["s"] } res, _ = time.ParseInLocation(layout, str, loc) return } /* 时间搓转换成日期 @timestamp 待转换的时间戳 @timeType 转换类型 */ func UnixTimeToDay(timeStamp int64, timeType int) (dateStr string) { timeTemplate := "2006-01-02 15:04:05" //常规类型 switch timeType { case 1: timeTemplate = "2006/01/02 15:04:05" case 2: timeTemplate = "2006/01/02 15:04" case 3: timeTemplate = "2006/01/02 15" case 4: timeTemplate = "2006/01/02" case 5: timeTemplate = "15:04:05" case 6: timeTemplate = "15:04" case 7: timeTemplate = "15" case 8: timeTemplate = "04:05" case 9: timeTemplate = "04" case 10: timeTemplate = "05" case 11: timeTemplate = "2006-01-02 15:04:05" case 12: timeTemplate = "2006-01-02 15:04" case 13: timeTemplate = "2006-01-02 15" case 14: timeTemplate = "2006-01-02" case 15: timeTemplate = "2006-01" //年月 case 16: timeTemplate = "2006" //年 case 17: timeTemplate = "01" //月 case 18: timeTemplate = "02" //日 case 19: //季度 dayMonth := time.Unix(timeStamp, 0).Format("01") datMonthFloat, datMonthFloatErr := strconv.ParseFloat(dayMonth, 10) if datMonthFloatErr == nil { dateStr = strconv.FormatFloat(math.Ceil(datMonthFloat/3), 'f', -1, 64) } else { dateStr = "1" } dateStr = "1" // fmt.Printf("获取是电话卡-------------->%v------------>%v------------>%v\n", dateStr, datMonthFloat, datMonthFloatErr) case 20: timeTemplate = "20060102" case 21: timeTemplate = "200601" case 22: timeTemplate = "01-02" case 23: //当前日期为本月第几周 monthFirstDayStr := DateToTimeStampOld(UnixTimeToDay(timeStamp, 10) + "-01 00:00:00") //获取指定月第一天时间戳 dayTime := time.Unix(monthFirstDayStr, 0) dayOfWeek := int(dayTime.Weekday()) //获取本月第一天是周几 if dayOfWeek == 0 { dayOfWeek = 7 } dayNumber, dayNumberErr := strconv.ParseInt(UnixTimeToDay(timeStamp, 9), 10, 64) //获取今天是几号 if dayNumberErr != nil { dayNumber = 1 } daysAndWeeksDiff := dayNumber - (8 - int64(dayOfWeek)) if daysAndWeeksDiff <= 0 { dateStr = "1" } else { daysAndWeeksDiffFlot, daysAndWeeksDiffFloatErr := strconv.ParseFloat(strconv.FormatInt(daysAndWeeksDiff, 10), 10) if daysAndWeeksDiffFloatErr == nil { daysWeeksDiffVal := math.Ceil(daysAndWeeksDiffFlot/7) + 1 dateStr = strconv.FormatFloat(daysWeeksDiffVal, 'f', -1, 64) } else { dateStr = "1" } } case 24: timeTemplate = "2006.01.02" case 25: timeTemplate = "2006.01" case 26: timeTemplate = "01.02" case 27: timeTemplate = "2006.01.02 15:04:05" case 28: timeTemplate = "2006012" case 29: timeTemplate = "200612" case 30: timeTemplate = "0612" case 31: timeTemplate = "20061" case 32: timeTemplate = "06" case 33: timeTemplate = "0612" case 34: timeTemplate = "061" case 35: timeTemplate = "0102" case 36: timeTemplate = "012" case 37: timeTemplate = "12" case 38: timeTemplate = "1" case 39: timeTemplate = "2" case 40: timeTemplate = "2006/01" case 41: //当前年第几周 timeDay := TimeUnixToTime(timeStamp, "s") year, week := timeDay.ISOWeek() dateStr = fmt.Sprintf("%v年第%v周", year, week) return dateStr default: timeTemplate = "2006-01-02 15:04:05" //常规类型 } dateStr = time.Unix(timeStamp, 0).Format(timeTemplate) return } /* 日期转时间戳 */ func DateToTimeStamp(dataStr string) (timeStamp int64, isTrue bool) { isTrue = false tmp := "2006-01-02 15:04:05" res, err := time.ParseInLocation(tmp, dataStr, time.Local) timeStamp = res.Unix() if err == nil { isTrue = true } return } func DateToTimeStampOld(dataStr string) (timeStamp int64) { tmp := "2006-01-02 15:04:05" res, _ := time.ParseInLocation(tmp, dataStr, time.Local) timeStamp = res.Unix() return } // 数据库查询翻页 func LimitPage[T GenericityVariableNumber](page, pageSize T) (offSet T) { if page < 1 { page = 1 } offSet = pageSize * (page - 1) if offSet < 0 { offSet = 0 } return } /* * @ 作者: 秦东 @ 时间: 2025-02-26 09:31:10 @ 功能: ZeroFillByStr @Description: 字符串补零 @param str :需要操作的字符串 @param resultLen 结果字符串的长度 @param reverse true 为前置补零,false 为后置补零 @return string */ func ZeroFillByStr(str string, resultLen int, reverse bool) string { if len(str) > resultLen || resultLen <= 0 { return str } if reverse { return fmt.Sprintf("%0*s", resultLen, str) //不足前置补零 } result := str for i := 0; i < resultLen-len(str); i++ { result += "0" } return result } // sha1算法 func Sha1Encryption(str string) string { sha1 := sha1.New() sha1.Write([]byte(str)) return hex.EncodeToString(sha1.Sum(nil)) } // 初始化程序 md5 func (m *Md5Encryption) Md5EncryptionInit(code string) { m.AppKey = appConstant.Constant_Config.Appsetup.AppKey m.Code = code } /* * @ 作者: 秦东 @ 时间: 2025-02-26 09:32:09 @ 功能: 加密算法 (md5) */ func (m *Md5Encryption) Md5EncryptionAlgorithm() (md5Val string) { if m.AppKey == "" { m.Md5EncryptionInit(m.Code) } // fmt.Printf("Code ====> %v\n", m.Code) // fmt.Printf("AppKey ====> %v\n", m.AppKey) mdNew := md5.New() mdNew.Write([]byte(m.AppKey)) keyMd5 := fmt.Sprintf("%x", mdNew.Sum(nil)) // fmt.Printf("Step1:--AppKey-加密->%v\n", keyMd5) codeNewMd1 := md5.New() codeNewMd1.Write([]byte(m.Code)) codeMd1 := fmt.Sprintf("%x", codeNewMd1.Sum(nil)) // fmt.Printf("Step2:--CodeString-加密->%v\n", codeMd1) yiCeng := codeMd1 + keyMd5 // fmt.Printf("Step3:--CodeString+AppKey-->%v\n", yiCeng) yiCengNew := md5.New() yiCengNew.Write([]byte(yiCeng)) yiCengMd5 := fmt.Sprintf("%x", yiCengNew.Sum(nil)) // fmt.Printf("Step4:--one-加密->%v\n", yiCengMd5) erCeng := yiCengMd5 + m.AppKey // fmt.Printf("Step5:--one + AppKey->%v\n", erCeng) // fmt.Printf("AppKey ===2=> %v\n", m.AppKey) erCengNew := md5.New() erCengNew.Write([]byte(erCeng)) md5Val = fmt.Sprintf("%x", erCengNew.Sum(nil)) // fmt.Printf("Step6:--therr--加密-->%v\n", md5Val) // md5Val = codeMd1 return } /* * @ 作者: 秦东 @ 时间: 2025-02-26 09:34:59 @ 功能: 计算当前时间N个月后的时间 @timeStamp 当前时间戳 @futureTime 正数多少时间后,负数多少时间前 */ func GetFutureMonthTime(timeStamp int64, futureTime, class int) (dateStr int64) { timeUnix := time.Unix(timeStamp, 0) addDate := timeUnix.AddDate(0, 0, futureTime) switch class { case 2: addDate = timeUnix.AddDate(0, futureTime, 0) case 3: addDate = timeUnix.AddDate(futureTime, 0, 0) default: addDate = timeUnix.AddDate(0, 0, futureTime) } dateStr = addDate.Unix() return } /* * @ 作者: 秦东 @ 时间: 2025-02-26 09:35:38 @ 功能: 判断字符串是否在切片中 泛型 */ func IsInTrue[T GenericityVariable](key T, keyAry []T) (isTrue bool) { isTrue = false for _, v := range keyAry { if v == key { return true } } return } /* * @ 作者: 秦东 @ 时间: 2025-02-26 09:35:52 @ 功能: 获取两个切片得差集 */ func DifferenceSet[T GenericityVariable](one, two []T) []T { var three []T temp := map[T]struct{}{} for _, val := range two { if _, ok := temp[val]; !ok { temp[val] = struct{}{} } } for _, val := range one { if _, ok := temp[val]; !ok { three = append(three, val) } } return three } // 两个切片的交集 func Intersect[T GenericityVariable](a, b []T) []T { inter := make([]T, 0) mp := make(map[T]bool) for _, s := range a { if _, ok := mp[s]; !ok { mp[s] = true } } for _, s := range b { if _, ok := mp[s]; ok { inter = append(inter, s) } } return inter } //判断类型转换成 /* * @ 作者: 秦东 @ 时间: 2025-02-26 09:36:56 @ 功能: 字符转int */ func StringToInt(val interface{}) (int, error) { switch val.(type) { case string: return strconv.Atoi(val.(string)) case int: return val.(int), nil default: return 0, nil } return 0, nil } /* * @ 作者: 秦东 @ 时间: 2025-02-26 09:37:09 @ 功能: 字符转int64 */ func StringToInt64(val interface{}) (int64, error) { switch valData := val.(type) { case string: return strconv.ParseInt(valData, 10, 64) case int: return int64(valData), nil case int8: return int64(valData), nil case int16: return int64(valData), nil case int32: return int64(valData), nil case int64: return valData, nil case uint: return int64(valData), nil case uint8: return int64(valData), nil case uint16: return int64(valData), nil case uint32: return int64(valData), nil case uint64: return int64(valData), nil case float64: val := strconv.FormatFloat(valData, 'f', -1, 64) valInt, err := strconv.ParseInt(val, 10, 64) return valInt, err default: return 0, nil } return 0, nil } /* * @ 作者: 秦东 @ 时间: 2025-02-26 09:38:15 @ 功能: map[string]string 转 struct */ func MapToStruct(mapString map[string]string, structInterface interface{}, tag string) (err error) { strType := reflect.TypeOf(structInterface) strValue := reflect.ValueOf(structInterface) switch strType.Kind() { case reflect.Ptr: if strType.Elem().Kind() != reflect.Struct { // fmt.Printf("1-->%v\n", strType.Elem().Kind().String()) return errors.New("需要*struct类型,却传入*" + strType.Elem().Kind().String() + "类型") } default: // fmt.Printf("2-->%v\n", strType.Kind().String()) return errors.New("需要*struct类型,却传入" + strType.Kind().String() + "类型") } // fmt.Printf("strType--->%v---strValue---->%v\n", strType, strValue) strTypeElem := strType.Elem() strValueElem := strValue.Elem() strTypeNum := strTypeElem.NumField() // fmt.Printf("strTypeElem--->%v---strValueElem---->%v---------strTypeNum--------->%v\n", strTypeElem, strValueElem, strTypeNum) for i := 0; i < strTypeNum; i++ { fieldName := strTypeElem.Field(i).Name if tag != "" { fieldName = strTypeElem.Field(i).Tag.Get(tag) } value, ok := mapString[fieldName] if !ok { continue } // fmt.Printf("name--->%v---tag---->%v----value---->%v----ok---->%v\n", fieldName, tag, value, ok) if strValueElem.Field(i).CanSet() { // fmt.Printf("Type--->%v---value---->%v\n", strValueElem.Field(i).Type(), reflect.TypeOf(value)) valType := fmt.Sprintf("%v", strValueElem.Field(i).Type()) switch valType { case "int": valueInt, _ := strconv.Atoi(value) strValueElem.Field(i).Set(reflect.ValueOf(valueInt)) case "int32": valueInt32, _ := strconv.ParseInt(value, 10, 32) strValueElem.Field(i).Set(reflect.ValueOf(int32(valueInt32))) case "int64": valueInt64, _ := strconv.ParseInt(value, 10, 64) strValueElem.Field(i).Set(reflect.ValueOf(valueInt64)) case "float32": valuefloat32, _ := strconv.ParseFloat(value, 32) strValueElem.Field(i).Set(reflect.ValueOf(float32(valuefloat32))) case "float64": valuefloat64, _ := strconv.ParseFloat(value, 64) strValueElem.Field(i).Set(reflect.ValueOf(valuefloat64)) case "string": strValueElem.Field(i).Set(reflect.ValueOf(value)) default: } } else { continue } } return } /* * @ 作者: 秦东 @ 时间: 2025-02-26 09:38:41 @ 功能: 数据库翻页设置 */ func PageTurningSettings(gormDb *gorm.DB, page, pageSize int) *gorm.DB { if page < 0 { page = 1 } if pageSize < 0 { pageSize = 10 } gormDb = gormDb.Limit(pageSize).Offset(LimitPage(page, pageSize)) return gormDb } /* * @ 作者: 秦东 @ 时间: 2025-02-26 09:39:08 @ 功能: 浮点数保留小数 */ func DecimalEs(value float64, weishu int) float64 { switch weishu { case 3: value, _ = strconv.ParseFloat(fmt.Sprintf("%.3f", value), 64) case 4: value, _ = strconv.ParseFloat(fmt.Sprintf("%.4f", value), 64) case 5: value, _ = strconv.ParseFloat(fmt.Sprintf("%.5f", value), 64) case 6: value, _ = strconv.ParseFloat(fmt.Sprintf("%.6f", value), 64) default: value, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", value), 64) } return value } /* * @ 作者: 秦东 @ 时间: 2025-02-26 09:42:25 @ 功能: 判断指定日期是周几 */ func GetWeekday(date string) (string, error) { layout := "2006-01-02" t, err := time.Parse(layout, date) if err != nil { return fmt.Sprintf("%v", time.Sunday), err } dayOfWeek := t.Weekday() var weekdays = [...]string{ "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", } return fmt.Sprintf(weekdays[dayOfWeek]), nil } /* * @ 作者: 秦东 @ 时间: 2025-02-26 09:42:39 @ 功能: 时间计算(年、季、月、周、日、时、分、秒) */ func ComputingTime(timeStamp int64, timeType int) (timeDataInt int64) { var timeData string = "1" switch timeType { case 1: timeData = time.Unix(timeStamp, 0).Format("2006") //年 case 2: dayMonth := time.Unix(timeStamp, 0).Format("01") //季度 datMonthFloat, datMonthFloatErr := strconv.ParseFloat(dayMonth, 10) if datMonthFloatErr == nil { timeData = strconv.FormatFloat(math.Ceil(datMonthFloat/3), 'f', -1, 64) } else { timeData = "1" } case 3: timeData = time.Unix(timeStamp, 0).Format("01") //月份 case 4: //当前日期为本月第几周 monthFirstDayStr := DateToTimeStampOld(UnixTimeToDay(timeStamp, 15) + "-01 00:00:00") //获取指定月第一天时间戳 dayTime := time.Unix(monthFirstDayStr, 0) dayOfWeek := int(dayTime.Weekday()) //获取本月第一天是周几 if dayOfWeek == 0 { dayOfWeek = 7 } dayNumber, dayNumberErr := strconv.ParseInt(UnixTimeToDay(timeStamp, 18), 10, 64) //获取今天是几号 if dayNumberErr != nil { dayNumber = 1 } daysAndWeeksDiff := dayNumber - (8 - int64(dayOfWeek)) if daysAndWeeksDiff <= 0 { timeData = "1" } else { daysAndWeeksDiffFlot, daysAndWeeksDiffFloatErr := strconv.ParseFloat(strconv.FormatInt(daysAndWeeksDiff, 10), 10) if daysAndWeeksDiffFloatErr == nil { daysWeeksDiffVal := math.Ceil(daysAndWeeksDiffFlot/7) + 1 timeData = strconv.FormatFloat(daysWeeksDiffVal, 'f', -1, 64) } else { timeData = "1" } } case 5: timeData = time.Unix(timeStamp, 0).Format("02") //天 case 7: timeData = time.Unix(timeStamp, 0).Format("15") //时 case 8: timeData = time.Unix(timeStamp, 0).Format("04") //分 case 9: timeData = time.Unix(timeStamp, 0).Format("05") //秒 default: timeData = "0" } timeDataInt, timeDataIntErr := strconv.ParseInt(timeData, 10, 64) if timeDataIntErr != nil { timeDataInt = 0 return } return } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:05:37 @ 功能: 获取指定月的起止时间 */ func GetAppointMonthStarAndEndTime(dayTime string) (startTime, endTime int64) { dataTypeAll := "2006-01-02" dayTime = fmt.Sprintf("%v-%v", dayTime, "01") firstToTime := StringToTimeIng("d", dayTime) startTimeStr := fmt.Sprintf("%v 00:00:00", firstToTime.AddDate(0, 0, 0).Format(dataTypeAll)) endTimeStr := fmt.Sprintf("%v 23:59:59", firstToTime.AddDate(0, 1, -1).Format(dataTypeAll)) // startTime = dayTime startTime = DateToTimeStampOld(startTimeStr) endTime = DateToTimeStampOld(endTimeStr) return } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:44:39 @ 功能: 获得月份最后一天,最后一秒 #nextYear 年 #nextMonth 月 */ func GetDaysInMonth(nextYear int, nextMonth int) DateTimeTotimes { firstDayOfNextMonth := time.Date(nextYear, time.Month(nextMonth), 1, 0, 0, 0, 0, time.UTC) lastDayOfThisMonth := firstDayOfNextMonth.Add(-1 * time.Second) //fmt.Println("本月最后一天时间:", lastDayOfThisMonth) dates := lastDayOfThisMonth.Format("2006-01-02 15:04:05") var creTimeAll DateTimeTotimes creTimeAll.BaisStrToTime(dates) return creTimeAll } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:45:17 @ 功能: 获取指定时间的上个月的开始和结束时间 #dayTime 时间 */ func GetLastMonthStartEnd(dayTime string) (int64, int64) { // dataTypeAll := "2006-01-02" // dayTime = fmt.Sprintf("%v-%v", dayTime, "01") now := StringToTimeIng("d", dayTime) // now := time.Now() lastMonthFirstDay := now.AddDate(0, -1, -now.Day()+1) lastMonthStart := time.Date(lastMonthFirstDay.Year(), lastMonthFirstDay.Month(), lastMonthFirstDay.Day(), 0, 0, 0, 0, now.Location()).Unix() lastMonthEndDay := lastMonthFirstDay.AddDate(0, 1, -1) lastMonthEnd := time.Date(lastMonthEndDay.Year(), lastMonthEndDay.Month(), lastMonthEndDay.Day(), 23, 59, 59, 0, now.Location()).Unix() return lastMonthStart, lastMonthEnd } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:07:07 @ 功能: 获取指定日的起止时间副本 */ func GetAppointMonthStarAndEndTimeEs(dayTime string) (startTime, endTime int64) { dataTypeAll := "2006-01-02" firstToTime := StringToTimeIng("d", dayTime) startTimeStr := fmt.Sprintf("%v 00:00:00", firstToTime.AddDate(0, 0, 0).Format(dataTypeAll)) endTimeStr := fmt.Sprintf("%v 23:59:59", firstToTime.AddDate(0, 1, -1).Format(dataTypeAll)) // startTime = dayTime startTime, _ = DateToTimeStamp(startTimeStr) endTime, _ = DateToTimeStamp(endTimeStr) return } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:12:42 @ 功能: 一天的起止时间(时间戳版本) */ func TimeUnixDayStartAndEnd(timeVal int64) (start, end int64) { timeStr := UnixTimeToDay(timeVal, 14) startTimeStr := fmt.Sprintf("%v 00:00:00", timeStr) endTimeStr := fmt.Sprintf("%v 23:59:59", timeStr) start = DateToTimeStampOld(startTimeStr) end = DateToTimeStampOld(endTimeStr) return } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:12:54 @ 功能: 计算日期差 */ func DayBetweenDate(oneDay, twoDay string) (int, error) { const layout = "2006-01-02" t1, err := time.Parse(layout, oneDay) if err != nil { return 0, err } t2, err := time.Parse(layout, twoDay) if err != nil { return 0, err } // 计算日期差 duration := t1.Sub(t2) // 转换为天数 days := int(duration.Hours() / 24) return days, nil } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:14:22 @ 功能: 合并数组 */ func MergeStruct[T GenericityVariable](aryOen, aryTwo []T) (structAry []T) { if len(aryOen) >= len(aryTwo) { structAry = aryOen for i := 0; i < len(aryTwo); i++ { if IsInTrue[T](aryTwo[i], structAry) == false { structAry = append(structAry, aryTwo[i]) } } } else { structAry = aryTwo for i := 0; i < len(aryOen); i++ { if IsInTrue[T](aryOen[i], structAry) == false { structAry = append(structAry, aryOen[i]) } } } return } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:14:42 @ 功能: 一天的开始与结束时间 @ 参数 #day 日期 #class 1:返回时间戳,2:返回日期 @ 返回值 #startTime 起始时间 #endTime 结束时间 @ 方法原型 # */ func OenDayStartOrEndTime(day string, class int) (startTime, endTime interface{}) { var creTimeAll DateTimeTotimes creTimeAll.BaisStrToTime(day) timeVal := UnixTimeToDay(creTimeAll.AllTime, 14) if class == 1 { startTime = DateToTimeStampOld(fmt.Sprintf("%v 00:00:00", timeVal)) endTime = DateToTimeStampOld(fmt.Sprintf("%v 23:59:59", timeVal)) } else { startTime = fmt.Sprintf("%v 00:00:00", timeVal) endTime = fmt.Sprintf("%v 23:59:59", timeVal) } return } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:16:07 @ 功能: 根据字符串组合时间,补全时间 #dateTime 日期 */ func (d *DateTimeTotimes) BaisStrToTime(dateTime string) { timeStrAry := strings.Split(dateTime, "-") switch len(timeStrAry) { case 1: dateTime = fmt.Sprintf("%v-01-01 12:00:00", dateTime) case 2: if len(timeStrAry[1]) < 2 { dateTime = fmt.Sprintf("%v-0%v-01 12:00:00", timeStrAry[0], timeStrAry[1]) } case 3: monthStr := timeStrAry[1] if len(timeStrAry[1]) < 2 { monthStr = fmt.Sprintf("0%v", timeStrAry[1]) } dayAry := strings.Split(timeStrAry[2], " ") // fmt.Printf("dayAry:%v------>%v\n", dayAry, len(dayAry)) dayStr := dayAry[0] if len(dayAry[0]) < 2 { dayStr = fmt.Sprintf("0%v", dayAry[0]) } if len(dayAry) > 1 { // fmt.Printf("dayAry[1]:%v------>%v\n", dayAry[1], len(dayAry[1])) if len(dayAry[1]) > 0 { Hours := "00" minutes := "00" seconds := "00" hisAry := strings.Split(dayAry[1], ":") switch len(hisAry) { case 1: if len(hisAry[0]) < 2 { Hours = fmt.Sprintf("0%v", hisAry[0]) } else { Hours = hisAry[0] } case 2: if len(hisAry[0]) < 2 { Hours = fmt.Sprintf("0%v", hisAry[0]) } else { Hours = hisAry[0] } if len(hisAry[1]) < 2 { minutes = fmt.Sprintf("0%v", hisAry[1]) } else { minutes = hisAry[1] } case 3: if len(hisAry[0]) < 2 { Hours = fmt.Sprintf("0%v", hisAry[0]) } else { Hours = hisAry[0] } if len(hisAry[1]) < 2 { minutes = fmt.Sprintf("0%v", hisAry[1]) } else { minutes = hisAry[1] } if len(hisAry[2]) < 2 { seconds = fmt.Sprintf("0%v", hisAry[2]) } else { seconds = hisAry[2] } default: } dayStr = fmt.Sprintf("%v %v:%v:%v", dayStr, Hours, minutes, seconds) } } // dayStr := timeStrAry[2] // if len(timeStrAry[2]) < 2 { // dayStr = fmt.Sprintf("0%v", timeStrAry[2]) // } dateTime = fmt.Sprintf("%v-%v-%v", timeStrAry[0], monthStr, dayStr) default: } // fmt.Printf("dateTime:%v---1--->%v\n", dateTime, len(dateTime)) orgTime, orgTimeErr := DateToTimeStamp(fmt.Sprintf("%v-01-01 12:00:00", dateTime)) if orgTimeErr { d.AllTime = orgTime d.AllTimeString = dateTime d.Years = strconv.FormatInt(ComputingTime(orgTime, 1), 10) d.Quarter = strconv.FormatInt(ComputingTime(orgTime, 2), 10) d.Months = strconv.FormatInt(ComputingTime(orgTime, 3), 10) d.Week = strconv.FormatInt(ComputingTime(orgTime, 4), 10) d.Days = strconv.FormatInt(ComputingTime(orgTime, 5), 10) d.Hours = strconv.FormatInt(ComputingTime(orgTime, 7), 10) d.Minutes = strconv.FormatInt(ComputingTime(orgTime, 8), 10) d.Second = strconv.FormatInt(ComputingTime(orgTime, 9), 10) } else { orgTime, orgTimeErr = DateToTimeStamp(fmt.Sprintf("%v-01 12:00:00", dateTime)) if orgTimeErr { d.AllTime = orgTime d.Years = strconv.FormatInt(ComputingTime(orgTime, 1), 10) d.Quarter = strconv.FormatInt(ComputingTime(orgTime, 2), 10) d.Months = strconv.FormatInt(ComputingTime(orgTime, 3), 10) d.Week = strconv.FormatInt(ComputingTime(orgTime, 4), 10) d.Days = strconv.FormatInt(ComputingTime(orgTime, 5), 10) d.Hours = strconv.FormatInt(ComputingTime(orgTime, 7), 10) d.Minutes = strconv.FormatInt(ComputingTime(orgTime, 8), 10) d.Second = strconv.FormatInt(ComputingTime(orgTime, 9), 10) fmt.Printf("dateTime:%v---2--->%v--->%v\n", orgTime, d.AllTime, d.Quarter) } else { orgTime, orgTimeErr = DateToTimeStamp(fmt.Sprintf("%v 12:00:00", dateTime)) if orgTimeErr { d.AllTime = orgTime d.Years = strconv.FormatInt(ComputingTime(orgTime, 1), 10) d.Quarter = strconv.FormatInt(ComputingTime(orgTime, 2), 10) d.Months = strconv.FormatInt(ComputingTime(orgTime, 3), 10) d.Week = strconv.FormatInt(ComputingTime(orgTime, 4), 10) d.Days = strconv.FormatInt(ComputingTime(orgTime, 5), 10) d.Hours = strconv.FormatInt(ComputingTime(orgTime, 7), 10) d.Minutes = strconv.FormatInt(ComputingTime(orgTime, 8), 10) d.Second = strconv.FormatInt(ComputingTime(orgTime, 9), 10) } else { orgTime, orgTimeErr = DateToTimeStamp(fmt.Sprintf("%v:00:00", dateTime)) if orgTimeErr { d.AllTime = orgTime d.Years = strconv.FormatInt(ComputingTime(orgTime, 1), 10) d.Quarter = strconv.FormatInt(ComputingTime(orgTime, 2), 10) d.Months = strconv.FormatInt(ComputingTime(orgTime, 3), 10) d.Week = strconv.FormatInt(ComputingTime(orgTime, 4), 10) d.Days = strconv.FormatInt(ComputingTime(orgTime, 5), 10) d.Hours = strconv.FormatInt(ComputingTime(orgTime, 7), 10) d.Minutes = strconv.FormatInt(ComputingTime(orgTime, 8), 10) d.Second = strconv.FormatInt(ComputingTime(orgTime, 9), 10) } else { orgTime, orgTimeErr = DateToTimeStamp(fmt.Sprintf("%v:00", dateTime)) if orgTimeErr { d.AllTime = orgTime d.Years = strconv.FormatInt(ComputingTime(orgTime, 1), 10) d.Quarter = strconv.FormatInt(ComputingTime(orgTime, 2), 10) d.Months = strconv.FormatInt(ComputingTime(orgTime, 3), 10) d.Week = strconv.FormatInt(ComputingTime(orgTime, 4), 10) d.Days = strconv.FormatInt(ComputingTime(orgTime, 5), 10) d.Hours = strconv.FormatInt(ComputingTime(orgTime, 7), 10) d.Minutes = strconv.FormatInt(ComputingTime(orgTime, 8), 10) d.Second = strconv.FormatInt(ComputingTime(orgTime, 9), 10) } else { orgTime, orgTimeErr = DateToTimeStamp(dateTime) if orgTimeErr { d.AllTime = orgTime d.Years = strconv.FormatInt(ComputingTime(orgTime, 1), 10) d.Quarter = strconv.FormatInt(ComputingTime(orgTime, 2), 10) d.Months = strconv.FormatInt(ComputingTime(orgTime, 3), 10) d.Week = strconv.FormatInt(ComputingTime(orgTime, 4), 10) d.Days = strconv.FormatInt(ComputingTime(orgTime, 5), 10) d.Hours = strconv.FormatInt(ComputingTime(orgTime, 7), 10) d.Minutes = strconv.FormatInt(ComputingTime(orgTime, 8), 10) d.Second = strconv.FormatInt(ComputingTime(orgTime, 9), 10) } } } } } d.AllTimeString = UnixTimeToDay(d.AllTime, 11) } } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:20:40 @ 功能: 获取指定符号中的数据 @ 参数 #s 待处理字符串 #starBracket 开始符号 #endBracket 结束符号 @ 返回值 #目标字符串 @ 方法原型 # */ func MatchBracket(s, starBracket, endBracket string) string { i := strings.Index(s, starBracket) if i >= 0 { // fmt.Printf("match-i-->%v\n", i) j := strings.Index(s[i:], endBracket) if j >= 0 { // fmt.Printf("match-j-->%v-->%v\n", j, s[i+1:i+j]) return s[i+1 : i+j] } } return "" } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:39:27 @ 功能: 类型转换 */ func TypeToClass(val interface{}, timeClass int) (str string) { if typeVal, ok := val.(uint); ok { str = UnixTimeToDay(int64(typeVal), timeClass) } else if typeVal, ok := val.(uint8); ok { str = UnixTimeToDay(int64(typeVal), timeClass) } else if typeVal, ok := val.(uint16); ok { str = UnixTimeToDay(int64(typeVal), timeClass) } else if typeVal, ok := val.(uint32); ok { str = UnixTimeToDay(int64(typeVal), timeClass) } else if typeVal, ok := val.(uint64); ok { str = UnixTimeToDay(int64(typeVal), timeClass) } else if typeVal, ok := val.(int); ok { str = UnixTimeToDay(int64(typeVal), timeClass) } else if typeVal, ok := val.(int8); ok { str = UnixTimeToDay(int64(typeVal), timeClass) } else if typeVal, ok := val.(int16); ok { str = UnixTimeToDay(int64(typeVal), timeClass) } else if typeVal, ok := val.(int32); ok { str = UnixTimeToDay(int64(typeVal), timeClass) } else if typeVal, ok := val.(int64); ok { str = UnixTimeToDay(typeVal, timeClass) } else if typeVal, ok := val.(float32); ok { str = UnixTimeToDay(int64(typeVal), timeClass) } else if typeVal, ok := val.(float64); ok { str = UnixTimeToDay(int64(typeVal), timeClass) } else if typeVal, ok := val.(byte); ok { valInt, valErr := strconv.ParseInt(string(typeVal), 10, 64) if valErr == nil { str = UnixTimeToDay(valInt, timeClass) } else { str = "" } } else if typeVal, ok := val.(string); ok { valInt, valErr := strconv.ParseInt(typeVal, 10, 64) if valErr == nil { str = UnixTimeToDay(valInt, timeClass) } else { str = "" } } else { str = "" } return } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:40:43 @ 功能: 根据身份证获取对应生日 @ 参数 #cardId 身份证号码 @ 返回值 #生日 @ 方法原型 # */ func GetBirthday(cardId string) string { if len(cardId) < 15 { return "" } // 兼容第一代15位身份证号码 if len(cardId) == 15 { // 第一代身份证年份都是19开头的 return fmt.Sprintf("19%s", cardId[6:12]) } else { return cardId[6:14] } } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:41:05 @ 功能: 根据生日日期得到用户年龄 */ func (b *BirthdayAge) GetAgeByBirthday(cardId string) { if len(cardId) < 15 { return } birthday := GetBirthday(cardId) if len(birthday) < 1 { b.Age = 0 } year, _ := strconv.Atoi(birthday[0:4]) month, _ := strconv.Atoi(birthday[4:6]) day, _ := strconv.Atoi(birthday[6:]) var months string if month < 10 { months = fmt.Sprintf("0%v", month) } else { months = strconv.Itoa(month) } var days string if day < 10 { days = fmt.Sprintf("0%v", day) } else { days = strconv.Itoa(day) } b.Birthday = fmt.Sprintf("%v-%v-%v", year, months, days) // 计算当前日期与生日中年月日都差值 now := time.Now() age := now.Year() - year moreMonth := int(now.Month()) - month moreDay := now.Day() - day // 未到生日月份,或者到了月份,但未到生日日期,年龄都要减1岁 if moreMonth < 0 || (moreMonth == 0 && moreDay < 0) { age-- } // 不要出现负值 if age < 0 { age = 0 } b.Age = age } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:41:50 @ 功能: 统计元素重复出现的次数 #ary 数组切片 */ func StatisticalDuplication[T GenericityVariable](ary []T) (mapAry map[T]int) { mapAry = make(map[T]int) count := 0 for i := 0; i < len(ary); i++ { for n := 0; n < len(ary); n++ { if ary[i] == ary[n] { count++ } } mapAry[ary[i]] = count count = 0 } return } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:42:16 @ 功能: 泛型类型断言 #val 位置类型数据 @ 返回字符串类型值 */ func TypeToInterface(val interface{}) string { switch balData := val.(type) { case int: return strconv.Itoa(balData) case int8: return strconv.FormatInt(int64(balData), 10) case int16: return strconv.FormatInt(int64(balData), 10) case int32: return strconv.FormatInt(int64(balData), 10) case int64: return strconv.FormatInt(balData, 10) case uint: return strconv.FormatUint(uint64(balData), 10) case uint8: return strconv.FormatUint(uint64(balData), 10) case uint16: return strconv.FormatUint(uint64(balData), 10) case uint32: return strconv.FormatUint(uint64(balData), 10) case uint64: return strconv.FormatUint(balData, 10) case float32: return fmt.Sprintf("%v", float64(balData)) case float64: return fmt.Sprintf("%v", float64(balData)) default: if balDataStr, ok := balData.(string); ok { if balDataStr != "" { return balDataStr } else { return "" } } else { return "" } } } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:43:32 @ 功能: 取最大值 */ func GetMaxNum[T GenericityVariable](ary []T) T { maxVal := ary[0] if len(ary) == 0 { return maxVal } for i := 1; i < len(ary); i++ { if maxVal < ary[i] { maxVal = ary[i] } } return maxVal } /* * @ 作者: 秦东 @ 时间: 2025-02-26 10:43:50 @ 功能: 泛型去重 */ func RemoveDuplicate[T GenericityVariable](ary []T) []T { m := make(map[T]bool) uniqueNumbers := []T{} for _, v := range ary { if !m[v] { m[v] = true uniqueNumbers = append(uniqueNumbers, v) } } return uniqueNumbers }