Time_test.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package test
  2. import (
  3. "testing"
  4. "time"
  5. "git.ooo.ink/root/go-kit/src/utilx"
  6. )
  7. // Test_Time 测试 TimeT 类型的时间计算功能
  8. //
  9. // 本测试验证以下功能:
  10. // 1. 时区设置是否正确加载
  11. // 2. 日级别的开始/结束时间戳和日期字符串
  12. // 3. 月级别的开始/结束时间戳和日期字符串
  13. // 4. 日期字符串解析功能
  14. //
  15. // 测试用例说明:
  16. // • 使用 "Asia/Shanghai" 时区进行测试
  17. // • 验证当前时间所在日/月的范围计算
  18. // • 检查时间戳和日期字符串的格式正确性
  19. //
  20. // 预期结果:
  21. // • LocDayStartDateStr: 返回 "YYYY-MM-DD" 格式的日期字符串
  22. // • LocDayStartTimestamp: 返回当天 00:00:00 时间戳
  23. // • LocDayEndTimestamp: 返回当天 23:59:59 时间戳
  24. // • LocMonthStartDateStr: 返回 "YYYY-MM" 格式的月份开始日期
  25. // • LocMonthStartTimestamp: 返回月份第一天的 00:00:00 时间戳
  26. // • LocMonthEndTimestamp: 返回月份最后一天的 23:59:59 时间戳
  27. // • ParseDayStartTimestamp: 解析日期字符串返回开始时间戳
  28. // • ParseDayEndTimestamp: 解析日期字符串返回结束时间戳
  29. //
  30. // 示例输出:
  31. //
  32. // Time_test.go:18: 2024-01-15
  33. // Time_test.go:19: 1705276800
  34. // Time_test.go:20: 1705363199
  35. // Time_test.go:21: 2024-01
  36. // Time_test.go:22: 1704038400
  37. // Time_test.go:23: 1706716799
  38. func Test_Time(t *testing.T) {
  39. // 创建上海时区的时间工具实例
  40. var (
  41. Time = utilx.TimeT{
  42. LocationName: "Asia/Shanghai",
  43. }
  44. now = time.Now().Unix()
  45. )
  46. t.Log("=== 基础信息 ===")
  47. t.Log("当前时间戳:", now)
  48. t.Log("时区:", Time.Loc())
  49. t.Log("\n=== 日级别时间计算 ===")
  50. t.Log("日期字符串:", Time.LocDayStartDateStr(now))
  51. t.Log("日开始时间戳:", Time.LocDayStartTimestamp(now))
  52. t.Log("日结束时间戳:", Time.LocDayEndTimestamp(now))
  53. t.Log("\n=== 月级别时间计算 ===")
  54. t.Log("月份开始日期:", Time.LocMonthStartDateStr(now))
  55. t.Log("月开始时间戳:", Time.LocMonthStartTimestamp(now))
  56. t.Log("月结束时间戳:", Time.LocMonthEndTimestamp(now))
  57. t.Log("\n=== 日期字符串解析 ===")
  58. testDate := "2024-01-15"
  59. t.Log("测试日期:", testDate)
  60. t.Log("解析开始时间戳:", Time.ParseDayStartTimestamp(testDate))
  61. t.Log("解析结束时间戳:", Time.ParseDayEndTimestamp(testDate))
  62. // 验证时区加载
  63. loc := Time.Loc()
  64. if loc == nil {
  65. t.Error("时区加载失败")
  66. }
  67. // 验证日期字符串格式
  68. dayStartStr := Time.LocDayStartDateStr(now)
  69. if len(dayStartStr) != 10 || dayStartStr[4] != '-' || dayStartStr[7] != '-' {
  70. t.Errorf("日期字符串格式错误: %s", dayStartStr)
  71. }
  72. monthStartStr := Time.LocMonthStartDateStr(now)
  73. if len(monthStartStr) != 7 || monthStartStr[4] != '-' {
  74. t.Errorf("月份开始日期格式错误: %s", monthStartStr)
  75. }
  76. // 验证日级别时间戳范围合理性
  77. dayStart := Time.LocDayStartTimestamp(now)
  78. dayEnd := Time.LocDayEndTimestamp(now)
  79. if dayStart >= dayEnd {
  80. t.Errorf("日时间戳范围无效: 开始 %d >= 结束 %d", dayStart, dayEnd)
  81. }
  82. if dayEnd-dayStart != 24*3600-1 { // 正好24小时减1秒
  83. t.Errorf("日时间范围不正确: 开始 %d, 结束 %d, 差值 %d", dayStart, dayEnd, dayEnd-dayStart)
  84. }
  85. // 验证月级别时间戳范围合理性
  86. monthStart := Time.LocMonthStartTimestamp(now)
  87. monthEnd := Time.LocMonthEndTimestamp(now)
  88. if monthStart >= monthEnd {
  89. t.Errorf("月份时间戳范围无效: 开始 %d >= 结束 %d", monthStart, monthEnd)
  90. }
  91. if monthEnd-monthStart < 28*24*3600 { // 至少28天
  92. t.Errorf("月份时间范围过短: 开始 %d, 结束 %d", monthStart, monthEnd)
  93. }
  94. // 验证日期字符串解析
  95. parsedDayStart := Time.ParseDayStartTimestamp(testDate)
  96. parsedDayEnd := Time.ParseDayEndTimestamp(testDate)
  97. if parsedDayStart == 0 || parsedDayEnd == 0 {
  98. t.Error("日期字符串解析失败")
  99. }
  100. if parsedDayEnd-parsedDayStart != 24*3600-1 {
  101. t.Errorf("解析后的日时间范围不正确: 开始 %d, 结束 %d", parsedDayStart, parsedDayEnd)
  102. }
  103. // 验证解析结果与直接计算的一致性
  104. directDayStart := Time.LocDayStartTimestamp(parsedDayStart)
  105. if directDayStart != parsedDayStart {
  106. t.Errorf("解析与直接计算不一致: 解析 %d, 直接 %d", parsedDayStart, directDayStart)
  107. }
  108. t.Log("\n✅ 时间工具所有方法测试通过")
  109. }
  110. // Test_TimeEdgeCases 测试边界情况和异常处理
  111. func Test_TimeEdgeCases(t *testing.T) {
  112. t.Log("=== 边界情况测试 ===")
  113. // 测试无效时区
  114. invalidTime := utilx.TimeT{LocationName: "Invalid/Timezone"}
  115. loc := invalidTime.Loc()
  116. if loc.String() != "UTC" {
  117. t.Errorf("无效时区应返回UTC,实际返回: %s", loc.String())
  118. }
  119. t.Log("无效时区处理正确,返回:", loc.String())
  120. // 测试零时间戳
  121. zeroTime := utilx.TimeT{LocationName: "Asia/Shanghai"}
  122. zeroTimestamp := int64(0)
  123. dayStart := zeroTime.LocDayStartTimestamp(zeroTimestamp)
  124. dayEnd := zeroTime.LocDayEndTimestamp(zeroTimestamp)
  125. if dayStart == 0 || dayEnd == 0 {
  126. t.Error("零时间戳处理失败")
  127. }
  128. t.Log("零时间戳处理正确,日开始:", dayStart, "日结束:", dayEnd)
  129. // 测试无效日期字符串解析
  130. invalidDate := "2024-13-45" // 无效日期
  131. parsedStart := zeroTime.ParseDayStartTimestamp(invalidDate)
  132. parsedEnd := zeroTime.ParseDayEndTimestamp(invalidDate)
  133. if parsedStart != 0 || parsedEnd != 0 {
  134. t.Error("无效日期字符串应返回0")
  135. }
  136. t.Log("无效日期字符串处理正确,返回0")
  137. // 测试闰年2月
  138. leapYearDate := "2024-02-29" // 闰年2月29日
  139. leapTime := utilx.TimeT{LocationName: "Asia/Shanghai"}
  140. leapStart := leapTime.ParseDayStartTimestamp(leapYearDate)
  141. leapEnd := leapTime.ParseDayEndTimestamp(leapYearDate)
  142. if leapStart == 0 || leapEnd == 0 {
  143. t.Error("闰年日期解析失败")
  144. }
  145. // 验证闰年2月的时间范围
  146. if leapEnd-leapStart != 24*3600-1 {
  147. t.Errorf("闰年日期时间范围不正确: 开始 %d, 结束 %d", leapStart, leapEnd)
  148. }
  149. t.Log("闰年日期处理正确,开始:", leapStart, "结束:", leapEnd)
  150. // 测试月份边界(12月到1月的转换)
  151. decTimestamp := int64(1704067200) // 2024-01-01 00:00:00 UTC+8
  152. decTime := utilx.TimeT{LocationName: "Asia/Shanghai"}
  153. monthStart := decTime.LocMonthStartTimestamp(decTimestamp)
  154. monthEnd := decTime.LocMonthEndTimestamp(decTimestamp)
  155. if monthStart >= monthEnd {
  156. t.Errorf("12月到1月转换失败: 开始 %d >= 结束 %d", monthStart, monthEnd)
  157. }
  158. t.Log("月份边界处理正确,月开始:", monthStart, "月结束:", monthEnd)
  159. t.Log("\n✅ 边界情况测试通过")
  160. }