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✅ 边界情况测试通过") }