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