|
@@ -0,0 +1,196 @@
|
|
|
|
|
+package test
|
|
|
|
|
+
|
|
|
|
|
+import (
|
|
|
|
|
+ "testing"
|
|
|
|
|
+ "time"
|
|
|
|
|
+
|
|
|
|
|
+ "git.ooo.ink/root/go-kit/src/utilx"
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+// Test_Time 测试 TimeT 类型的时间计算功能
|
|
|
|
|
+//
|
|
|
|
|
+// 本测试验证以下功能:
|
|
|
|
|
+// 1. 时区设置是否正确加载
|
|
|
|
|
+// 2. 日级别的开始/结束时间戳和日期字符串
|
|
|
|
|
+// 3. 月级别的开始/结束时间戳和日期字符串
|
|
|
|
|
+// 4. 日期字符串解析功能
|
|
|
|
|
+//
|
|
|
|
|
+// 测试用例说明:
|
|
|
|
|
+// • 使用 "Asia/Shanghai" 时区进行测试
|
|
|
|
|
+// • 验证当前时间所在日/月的范围计算
|
|
|
|
|
+// • 检查时间戳和日期字符串的格式正确性
|
|
|
|
|
+//
|
|
|
|
|
+// 预期结果:
|
|
|
|
|
+// • LocDayStartDateStr: 返回 "YYYY-MM-DD" 格式的日期字符串
|
|
|
|
|
+// • LocDayStartTimestamp: 返回当天 00:00:00 时间戳
|
|
|
|
|
+// • LocDayEndTimestamp: 返回当天 23:59:59 时间戳
|
|
|
|
|
+// • LocMonthStartDateStr: 返回 "YYYY-MM" 格式的月份开始日期
|
|
|
|
|
+// • LocMonthStartTimestamp: 返回月份第一天的 00:00:00 时间戳
|
|
|
|
|
+// • LocMonthEndTimestamp: 返回月份最后一天的 23:59:59 时间戳
|
|
|
|
|
+// • ParseDayStartTimestamp: 解析日期字符串返回开始时间戳
|
|
|
|
|
+// • ParseDayEndTimestamp: 解析日期字符串返回结束时间戳
|
|
|
|
|
+//
|
|
|
|
|
+// 示例输出:
|
|
|
|
|
+//
|
|
|
|
|
+// Time_test.go:18: 2024-01-15
|
|
|
|
|
+// Time_test.go:19: 1705276800
|
|
|
|
|
+// Time_test.go:20: 1705363199
|
|
|
|
|
+// Time_test.go:21: 2024-01
|
|
|
|
|
+// Time_test.go:22: 1704038400
|
|
|
|
|
+// Time_test.go:23: 1706716799
|
|
|
|
|
+func Test_Time(t *testing.T) {
|
|
|
|
|
+ // 创建上海时区的时间工具实例
|
|
|
|
|
+ var (
|
|
|
|
|
+ Time = utilx.TimeT{
|
|
|
|
|
+ LocationName: "Asia/Shanghai",
|
|
|
|
|
+ }
|
|
|
|
|
+ now = time.Now().Unix()
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ t.Log("=== 基础信息 ===")
|
|
|
|
|
+ t.Log("当前时间戳:", now)
|
|
|
|
|
+ t.Log("时区:", Time.Loc())
|
|
|
|
|
+
|
|
|
|
|
+ t.Log("\n=== 日级别时间计算 ===")
|
|
|
|
|
+ t.Log("日期字符串:", Time.LocDayStartDateStr(now))
|
|
|
|
|
+ t.Log("日开始时间戳:", Time.LocDayStartTimestamp(now))
|
|
|
|
|
+ t.Log("日结束时间戳:", Time.LocDayEndTimestamp(now))
|
|
|
|
|
+
|
|
|
|
|
+ t.Log("\n=== 月级别时间计算 ===")
|
|
|
|
|
+ t.Log("月份开始日期:", Time.LocMonthStartDateStr(now))
|
|
|
|
|
+ t.Log("月开始时间戳:", Time.LocMonthStartTimestamp(now))
|
|
|
|
|
+ t.Log("月结束时间戳:", Time.LocMonthEndTimestamp(now))
|
|
|
|
|
+
|
|
|
|
|
+ t.Log("\n=== 日期字符串解析 ===")
|
|
|
|
|
+ testDate := "2024-01-15"
|
|
|
|
|
+ t.Log("测试日期:", testDate)
|
|
|
|
|
+ t.Log("解析开始时间戳:", Time.ParseDayStartTimestamp(testDate))
|
|
|
|
|
+ t.Log("解析结束时间戳:", Time.ParseDayEndTimestamp(testDate))
|
|
|
|
|
+
|
|
|
|
|
+ // 验证时区加载
|
|
|
|
|
+ loc := Time.Loc()
|
|
|
|
|
+ if loc == nil {
|
|
|
|
|
+ t.Error("时区加载失败")
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 验证日期字符串格式
|
|
|
|
|
+ dayStartStr := Time.LocDayStartDateStr(now)
|
|
|
|
|
+ if len(dayStartStr) != 10 || dayStartStr[4] != '-' || dayStartStr[7] != '-' {
|
|
|
|
|
+ t.Errorf("日期字符串格式错误: %s", dayStartStr)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ monthStartStr := Time.LocMonthStartDateStr(now)
|
|
|
|
|
+ if len(monthStartStr) != 7 || monthStartStr[4] != '-' {
|
|
|
|
|
+ t.Errorf("月份开始日期格式错误: %s", monthStartStr)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 验证日级别时间戳范围合理性
|
|
|
|
|
+ dayStart := Time.LocDayStartTimestamp(now)
|
|
|
|
|
+ dayEnd := Time.LocDayEndTimestamp(now)
|
|
|
|
|
+
|
|
|
|
|
+ if dayStart >= dayEnd {
|
|
|
|
|
+ t.Errorf("日时间戳范围无效: 开始 %d >= 结束 %d", dayStart, dayEnd)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if dayEnd-dayStart != 24*3600-1 { // 正好24小时减1秒
|
|
|
|
|
+ t.Errorf("日时间范围不正确: 开始 %d, 结束 %d, 差值 %d", dayStart, dayEnd, dayEnd-dayStart)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 验证月级别时间戳范围合理性
|
|
|
|
|
+ monthStart := Time.LocMonthStartTimestamp(now)
|
|
|
|
|
+ monthEnd := Time.LocMonthEndTimestamp(now)
|
|
|
|
|
+
|
|
|
|
|
+ if monthStart >= monthEnd {
|
|
|
|
|
+ t.Errorf("月份时间戳范围无效: 开始 %d >= 结束 %d", monthStart, monthEnd)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if monthEnd-monthStart < 28*24*3600 { // 至少28天
|
|
|
|
|
+ t.Errorf("月份时间范围过短: 开始 %d, 结束 %d", monthStart, monthEnd)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 验证日期字符串解析
|
|
|
|
|
+ parsedDayStart := Time.ParseDayStartTimestamp(testDate)
|
|
|
|
|
+ parsedDayEnd := Time.ParseDayEndTimestamp(testDate)
|
|
|
|
|
+
|
|
|
|
|
+ if parsedDayStart == 0 || parsedDayEnd == 0 {
|
|
|
|
|
+ t.Error("日期字符串解析失败")
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if parsedDayEnd-parsedDayStart != 24*3600-1 {
|
|
|
|
|
+ t.Errorf("解析后的日时间范围不正确: 开始 %d, 结束 %d", parsedDayStart, parsedDayEnd)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 验证解析结果与直接计算的一致性
|
|
|
|
|
+ directDayStart := Time.LocDayStartTimestamp(parsedDayStart)
|
|
|
|
|
+ if directDayStart != parsedDayStart {
|
|
|
|
|
+ t.Errorf("解析与直接计算不一致: 解析 %d, 直接 %d", parsedDayStart, directDayStart)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ t.Log("\n✅ 时间工具所有方法测试通过")
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Test_TimeEdgeCases 测试边界情况和异常处理
|
|
|
|
|
+func Test_TimeEdgeCases(t *testing.T) {
|
|
|
|
|
+ t.Log("=== 边界情况测试 ===")
|
|
|
|
|
+
|
|
|
|
|
+ // 测试无效时区
|
|
|
|
|
+ invalidTime := utilx.TimeT{LocationName: "Invalid/Timezone"}
|
|
|
|
|
+ loc := invalidTime.Loc()
|
|
|
|
|
+ if loc.String() != "UTC" {
|
|
|
|
|
+ t.Errorf("无效时区应返回UTC,实际返回: %s", loc.String())
|
|
|
|
|
+ }
|
|
|
|
|
+ t.Log("无效时区处理正确,返回:", loc.String())
|
|
|
|
|
+
|
|
|
|
|
+ // 测试零时间戳
|
|
|
|
|
+ zeroTime := utilx.TimeT{LocationName: "Asia/Shanghai"}
|
|
|
|
|
+ zeroTimestamp := int64(0)
|
|
|
|
|
+
|
|
|
|
|
+ dayStart := zeroTime.LocDayStartTimestamp(zeroTimestamp)
|
|
|
|
|
+ dayEnd := zeroTime.LocDayEndTimestamp(zeroTimestamp)
|
|
|
|
|
+
|
|
|
|
|
+ if dayStart == 0 || dayEnd == 0 {
|
|
|
|
|
+ t.Error("零时间戳处理失败")
|
|
|
|
|
+ }
|
|
|
|
|
+ t.Log("零时间戳处理正确,日开始:", dayStart, "日结束:", dayEnd)
|
|
|
|
|
+
|
|
|
|
|
+ // 测试无效日期字符串解析
|
|
|
|
|
+ invalidDate := "2024-13-45" // 无效日期
|
|
|
|
|
+ parsedStart := zeroTime.ParseDayStartTimestamp(invalidDate)
|
|
|
|
|
+ parsedEnd := zeroTime.ParseDayEndTimestamp(invalidDate)
|
|
|
|
|
+
|
|
|
|
|
+ if parsedStart != 0 || parsedEnd != 0 {
|
|
|
|
|
+ t.Error("无效日期字符串应返回0")
|
|
|
|
|
+ }
|
|
|
|
|
+ t.Log("无效日期字符串处理正确,返回0")
|
|
|
|
|
+
|
|
|
|
|
+ // 测试闰年2月
|
|
|
|
|
+ leapYearDate := "2024-02-29" // 闰年2月29日
|
|
|
|
|
+ leapTime := utilx.TimeT{LocationName: "Asia/Shanghai"}
|
|
|
|
|
+
|
|
|
|
|
+ leapStart := leapTime.ParseDayStartTimestamp(leapYearDate)
|
|
|
|
|
+ leapEnd := leapTime.ParseDayEndTimestamp(leapYearDate)
|
|
|
|
|
+
|
|
|
|
|
+ if leapStart == 0 || leapEnd == 0 {
|
|
|
|
|
+ t.Error("闰年日期解析失败")
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 验证闰年2月的时间范围
|
|
|
|
|
+ if leapEnd-leapStart != 24*3600-1 {
|
|
|
|
|
+ t.Errorf("闰年日期时间范围不正确: 开始 %d, 结束 %d", leapStart, leapEnd)
|
|
|
|
|
+ }
|
|
|
|
|
+ t.Log("闰年日期处理正确,开始:", leapStart, "结束:", leapEnd)
|
|
|
|
|
+
|
|
|
|
|
+ // 测试月份边界(12月到1月的转换)
|
|
|
|
|
+ decTimestamp := int64(1704067200) // 2024-01-01 00:00:00 UTC+8
|
|
|
|
|
+ decTime := utilx.TimeT{LocationName: "Asia/Shanghai"}
|
|
|
|
|
+
|
|
|
|
|
+ monthStart := decTime.LocMonthStartTimestamp(decTimestamp)
|
|
|
|
|
+ monthEnd := decTime.LocMonthEndTimestamp(decTimestamp)
|
|
|
|
|
+
|
|
|
|
|
+ if monthStart >= monthEnd {
|
|
|
|
|
+ t.Errorf("12月到1月转换失败: 开始 %d >= 结束 %d", monthStart, monthEnd)
|
|
|
|
|
+ }
|
|
|
|
|
+ t.Log("月份边界处理正确,月开始:", monthStart, "月结束:", monthEnd)
|
|
|
|
|
+
|
|
|
|
|
+ t.Log("\n✅ 边界情况测试通过")
|
|
|
|
|
+}
|