time.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // Copyright 2025 BackendServerTemplate Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package strconvutils
  5. import (
  6. "fmt"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. func ReadTimeDurationPositive(str string) time.Duration {
  12. res := ReadTimeDuration(str)
  13. if res < 0 {
  14. return 0
  15. }
  16. return res
  17. }
  18. func ReadTimeDuration(str string) time.Duration {
  19. if str == "forever" || str == "none" {
  20. return -1
  21. }
  22. if strings.HasSuffix(strings.ToUpper(str), "Y") {
  23. numStr := str[:len(str)-1]
  24. num, _ := strconv.ParseInt(numStr, 10, 64)
  25. return time.Hour * 24 * 365 * time.Duration(num)
  26. } else if strings.HasSuffix(strings.ToLower(str), "year") {
  27. numStr := str[:len(str)-4]
  28. num, _ := strconv.ParseInt(numStr, 10, 64)
  29. return time.Hour * 24 * 365 * time.Duration(num)
  30. }
  31. if strings.HasSuffix(strings.ToUpper(str), "M") {
  32. numStr := str[:len(str)-1]
  33. num, _ := strconv.ParseInt(numStr, 10, 64)
  34. return time.Hour * 24 * 31 * time.Duration(num)
  35. } else if strings.HasSuffix(strings.ToLower(str), "month") {
  36. numStr := str[:len(str)-5]
  37. num, _ := strconv.ParseInt(numStr, 10, 64)
  38. return time.Hour * 24 * 31 * time.Duration(num)
  39. }
  40. if strings.HasSuffix(strings.ToUpper(str), "W") {
  41. numStr := str[:len(str)-1]
  42. num, _ := strconv.ParseInt(numStr, 10, 64)
  43. return time.Hour * 24 * 7 * time.Duration(num)
  44. } else if strings.HasSuffix(strings.ToLower(str), "week") {
  45. numStr := str[:len(str)-4]
  46. num, _ := strconv.ParseInt(numStr, 10, 64)
  47. return time.Hour * 24 * 7 * time.Duration(num)
  48. }
  49. if strings.HasSuffix(strings.ToUpper(str), "D") {
  50. numStr := str[:len(str)-1]
  51. num, _ := strconv.ParseInt(numStr, 10, 64)
  52. return time.Hour * 24 * time.Duration(num)
  53. } else if strings.HasSuffix(strings.ToLower(str), "day") {
  54. numStr := str[:len(str)-3]
  55. num, _ := strconv.ParseInt(numStr, 10, 64)
  56. return time.Hour * 24 * time.Duration(num)
  57. }
  58. if strings.HasSuffix(strings.ToUpper(str), "H") {
  59. numStr := str[:len(str)-1]
  60. num, _ := strconv.ParseInt(numStr, 10, 64)
  61. return time.Hour * time.Duration(num)
  62. } else if strings.HasSuffix(strings.ToLower(str), "hour") {
  63. numStr := str[:len(str)-4]
  64. num, _ := strconv.ParseInt(numStr, 10, 64)
  65. return time.Hour * time.Duration(num)
  66. }
  67. if strings.HasSuffix(strings.ToUpper(str), "Min") { // 不能用M,否则会和 Month 冲突
  68. numStr := str[:len(str)-3]
  69. num, _ := strconv.ParseInt(numStr, 10, 64)
  70. return time.Minute * time.Duration(num)
  71. } else if strings.HasSuffix(strings.ToLower(str), "minute") {
  72. numStr := str[:len(str)-6]
  73. num, _ := strconv.ParseInt(numStr, 10, 64)
  74. return time.Minute * time.Duration(num)
  75. }
  76. if strings.HasSuffix(strings.ToUpper(str), "S") {
  77. numStr := str[:len(str)-1]
  78. num, _ := strconv.ParseInt(numStr, 10, 64)
  79. return time.Second * time.Duration(num)
  80. } else if strings.HasSuffix(strings.ToLower(str), "second") {
  81. numStr := str[:len(str)-6]
  82. num, _ := strconv.ParseInt(numStr, 10, 64)
  83. return time.Second * time.Duration(num)
  84. }
  85. if strings.HasSuffix(strings.ToUpper(str), "MS") {
  86. numStr := str[:len(str)-2]
  87. num, _ := strconv.ParseInt(numStr, 10, 64)
  88. return time.Millisecond * time.Duration(num)
  89. } else if strings.HasSuffix(strings.ToLower(str), "millisecond") {
  90. numStr := str[:len(str)-11]
  91. num, _ := strconv.ParseInt(numStr, 10, 64)
  92. return time.Millisecond * time.Duration(num)
  93. }
  94. if strings.HasSuffix(strings.ToUpper(str), "MiS") { // 不能用 MS , 否则会和 millisecond 冲突
  95. numStr := str[:len(str)-3]
  96. num, _ := strconv.ParseInt(numStr, 10, 64)
  97. return time.Microsecond * time.Duration(num)
  98. } else if strings.HasSuffix(strings.ToUpper(str), "MicroS") {
  99. numStr := str[:len(str)-6]
  100. num, _ := strconv.ParseInt(numStr, 10, 64)
  101. return time.Microsecond * time.Duration(num)
  102. } else if strings.HasSuffix(strings.ToLower(str), "microsecond") {
  103. numStr := str[:len(str)-11]
  104. num, _ := strconv.ParseInt(numStr, 10, 64)
  105. return time.Microsecond * time.Duration(num)
  106. }
  107. if strings.HasSuffix(strings.ToUpper(str), "NS") {
  108. numStr := str[:len(str)-2]
  109. num, _ := strconv.ParseInt(numStr, 10, 64)
  110. return time.Nanosecond * time.Duration(num)
  111. } else if strings.HasSuffix(strings.ToLower(str), "nanosecond") {
  112. numStr := str[:len(str)-10]
  113. num, _ := strconv.ParseInt(numStr, 10, 64)
  114. return time.Nanosecond * time.Duration(num)
  115. }
  116. num, _ := strconv.ParseInt(str, 10, 64)
  117. return time.Duration(num) * time.Second
  118. }
  119. func TimeDurationToStringCN(t time.Duration) string {
  120. const day = 24 * time.Hour
  121. const year = 365 * day
  122. if t > year {
  123. return fmt.Sprintf("%d年", t/year)
  124. } else if t > day {
  125. return fmt.Sprintf("%d天", t/day)
  126. } else if t > time.Hour {
  127. return fmt.Sprintf("%d小时", t/time.Hour)
  128. } else if t > time.Minute {
  129. return fmt.Sprintf("%d分钟", t/time.Minute)
  130. } else if t > time.Second {
  131. return fmt.Sprintf("%d秒", t/time.Second)
  132. }
  133. return "0秒"
  134. }
  135. func TimeDurationToString(t time.Duration) string {
  136. const day = 24 * time.Hour
  137. const year = 365 * day
  138. if t > year {
  139. return fmt.Sprintf("%dY", t/year)
  140. } else if t > day {
  141. return fmt.Sprintf("%dD", t/day)
  142. } else if t > time.Hour {
  143. return fmt.Sprintf("%dh", t/time.Hour)
  144. } else if t > time.Minute {
  145. return fmt.Sprintf("%dmin", t/time.Minute)
  146. } else if t > time.Second {
  147. return fmt.Sprintf("%ds", t/time.Second)
  148. }
  149. return "0s"
  150. }