util_more.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package util
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "math"
  7. "mime/multipart"
  8. "os"
  9. "strconv"
  10. "strings"
  11. "time"
  12. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  13. )
  14. func CurrentMaxFrameId() int32 {
  15. currentHour := time.Now().Local().Hour()
  16. return int32(math.Floor(float64(currentHour/2))) * 10
  17. }
  18. func ArrayInt32ToStrings(cowIds []int32, cutset string) string {
  19. var cows bytes.Buffer
  20. if len(cowIds) <= 0 {
  21. return cows.String()
  22. }
  23. for i, v := range cowIds {
  24. if i > 0 {
  25. cows.WriteString(cutset)
  26. }
  27. cows.WriteString(strconv.Itoa(int(v))) // 将整数转换为字符串
  28. }
  29. return cows.String()
  30. }
  31. // ConvertCowIdsToInt64Slice 将逗号拼接的字符串转换为 int64 切片
  32. func ConvertCowIdsToInt64Slice(input string) ([]int64, error) {
  33. // 如果输入为空,直接返回空切片
  34. if input == "" {
  35. return []int64{}, nil
  36. }
  37. // 按逗号分割字符串
  38. parts := strings.Split(input, ",")
  39. // 初始化结果切片
  40. result := make([]int64, 0, len(parts))
  41. // 遍历每个部分,转换为 int64
  42. for _, part := range parts {
  43. // 去除空格
  44. part = strings.TrimSpace(part)
  45. if part == "" {
  46. continue // 忽略空字符串
  47. }
  48. // 转换为 int64
  49. num, err := strconv.ParseInt(part, 10, 64)
  50. if err != nil {
  51. return nil, fmt.Errorf("invalid number: %s", part)
  52. }
  53. // 添加到结果切片
  54. result = append(result, num)
  55. }
  56. return result, nil
  57. }
  58. // GetMonthStartAndEndTimestamp 获取当前月份的开始时间戳和结束时间戳
  59. func GetMonthStartAndEndTimestamp() (startTimestamp, endTimestamp int64) {
  60. // 获取当前时间
  61. now := time.Now().Local()
  62. // 获取当前月份的第一天
  63. startOfMonth := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
  64. // 获取下一个月份的第一天,然后减去一秒,得到当前月份的最后一天
  65. endOfMonth := startOfMonth.AddDate(0, 1, 0).Add(-time.Second)
  66. // 转换为时间戳
  67. startTimestamp = startOfMonth.Unix()
  68. endTimestamp = endOfMonth.Unix()
  69. return startTimestamp, endTimestamp
  70. }
  71. // SubDays 计算两个日期(时间戳)之间的天数差
  72. func SubDays(startDay, endDay int64) int32 {
  73. s1 := time.Unix(startDay, 0).Local()
  74. s2 := time.Unix(endDay, 0).Local()
  75. return int32(s2.Sub(s1).Hours() / 24)
  76. }
  77. func TimeParseLocal(layout, dateTime string) (time.Time, error) {
  78. loc, _ := time.LoadLocation("Local")
  79. return time.ParseInLocation(layout, dateTime, loc)
  80. }
  81. func Substr(s string, start, length int) string {
  82. // 转换为rune切片以正确处理Unicode字符
  83. runes := []rune(s)
  84. l := start + length
  85. if l > len(runes) {
  86. l = len(runes)
  87. }
  88. return string(runes[start:l])
  89. }
  90. // FindMaxTime 辅助函数:获取多个时间中的最大值
  91. func FindMaxTime(times ...time.Time) time.Time {
  92. max := times[0]
  93. for _, t := range times[1:] {
  94. if t.After(max) {
  95. max = t
  96. }
  97. }
  98. return max
  99. }
  100. // FindMinTime 辅助函数:获取多个时间中的最小值
  101. func FindMinTime(times ...time.Time) time.Time {
  102. min := times[0]
  103. for _, t := range times[1:] {
  104. if t.Before(min) {
  105. min = t
  106. }
  107. }
  108. return min
  109. }
  110. func SaveUploadedFile(file *multipart.FileHeader, dst string) error {
  111. src, err := file.Open()
  112. if err != nil {
  113. return err
  114. }
  115. defer src.Close()
  116. out, err := os.Create(dst)
  117. if err != nil {
  118. return err
  119. }
  120. defer out.Close()
  121. _, err = io.Copy(out, src)
  122. return err
  123. }
  124. // BooleanToIsShow 将布尔值转换为IsShow_Kind
  125. func BooleanToIsShow(isShow bool) pasturePb.IsShow_Kind {
  126. showKind := pasturePb.IsShow_No
  127. if isShow {
  128. showKind = pasturePb.IsShow_Ok
  129. }
  130. return showKind
  131. }
  132. // DeduplicateInt64 去重
  133. func DeduplicateInt64(slice []int64) []int64 {
  134. seen := make(map[int64]struct{})
  135. result := make([]int64, 0, len(slice))
  136. for _, val := range slice {
  137. if _, exists := seen[val]; !exists {
  138. seen[val] = struct{}{}
  139. result = append(result, val)
  140. }
  141. }
  142. return result
  143. }