golang转换时间对象,时间字符串,时间戳到自定的时间字符串方法, 支持时间对象、秒/毫秒时间戳,时间字符串转换为统一的时间字符串

转换时间对象,时间字符串,时间戳到自定的时间字符串方法, 支持时间对象、秒/毫秒时间戳,时间字符串转换为统一的时间字符串。

TimeToStr转换函数代码:


// TimeToStr 转换 时间字符串/时间戳/时间对象 到字符串
// tval 要转换的时间对象,  时间戳(支持秒和毫秒), 时间字符串(注意,如果时间格式非默认的格式,需要指定时间格式)
// layouts 可选的时间格式
// 		默认输出字符串格式 "2006-01-02T15:04:05Z07:00",
// 		默认tval字符串对应的时间格式 "2006-01-02 15:04:05"
//
//	layouts可以传递多个时间格式参数,
//		第一个为最终返回的字符串格式,默认"2006-01-02T15:04:05Z07:00"
//		第二个为源格式(tval字符串对应的时间格式),默认"2006-01-02 15:04:05",仅tval为字符串时有效,
//			还会自动尝试格式 time.RFC3339, 2006年01月02日15:04:05
//
// 时间字符串
// @author tekintian <tekintian@gmail.com>
// @see https://dev.tekin.cn
func TimeToStr(tval interface{}, layouts ...string) string {
	// 默认时间格式,
	toLayout := time.RFC3339   // 默认转换后的字符串对应的时间格式 "2006-01-02T15:04:05Z07:00"
	srcLayout := time.DateTime // 默认tval对应的时间格式 "2006-01-02 15:04:05"
	switch len(layouts) {
	case 1:
		if layouts[0] != "" {
			toLayout = layouts[0]
		}
	case 2:
		if layouts[0] != "" {
			toLayout = layouts[0]
		}
		if layouts[1] != "" {
			srcLayout = layouts[1]
		}
	}
	// 根据不同类型选择对应的解析方式
	switch v := tval.(type) {
	case time.Time: // 时间对象
		return v.Format(toLayout)
	case int: // 时间戳解析
		return TsToStr(int64(v), toLayout)
	case uint:
		return TsToStr(int64(v), toLayout)
	case int64:
		return TsToStr(v, toLayout)
	case uint64:
		return TsToStr(int64(v), toLayout)
	case int32:
		return TsToStr(int64(v), toLayout)
	case uint32:
		return TsToStr(int64(v), toLayout)
	case string: // 字符串解析
		// 如果是字符串类型,将其解析为时间对象
		if t, err := time.Parse(srcLayout, v); err == nil {
			return t.Format(toLayout)
		}
		// 指定的时间格式解析失败,使用常用格式再次尝试
		if t, err := time.Parse(time.RFC3339, v); err == nil {
			return t.Format(toLayout)
		}
		// 使用这个 2006年01月02日15:04:05 格式尝试解析
		if t, err := time.Parse("2006年01月02日15:04:05", v); err == nil {
			return t.Format(toLayout)
		}
		return "" // 解析失败,返回空字符串
	default:
		return ""
	}
}

使用方法:

安装字符串工具包: go get -u github.com/tekintian/strutils

使用 : strutils.TimeToStr(1722684297911,"")

TimeToStr时间转换函数测试用例


func TestTimeToStr(t *testing.T) {
	ts, _ := time.Parse(time.DateTime, "2024-08-03 12:21:15") // ts对象
	// 测试用例
	testCases := []struct {
		input  interface{}
		output string
	}{
		{input: "2024年08月03日12:04:49", output: "2024-08-03T12:04:49Z"},
		{input: ts, output: "2024-08-03T12:21:15Z"},
		{input: 1722657237, output: "2024-08-03T11:53:57+08:00"},
		{input: 1722683285997, output: "2024-08-03T19:08:05+08:00"}, // 毫秒时间戳
	}
	for _, v := range testCases {
		ival := strutils.TimeToStr(v.input)
		if ival != v.output {
			t.Fatalf("Expected output to be %v, got %v", v.output, ival)
		}
	}
	// 时间戳, 指定输出字符串格式
	ival := strutils.TimeToStr(1722657237, time.DateTime)
	if ival != "2024-08-03 11:53:57" {
		t.Fatalf("Expected output to be 2024-08-03 11:53:57, got %v", ival)
	}
	// 指定输入tval字符串的格式,和最终输出字符串格式
	ival2 := strutils.TimeToStr("2024-08-03T12:21:15Z", time.DateTime, time.RFC3339)
	if ival2 != "2024-08-03 12:21:15" {
		t.Fatalf("Expected output to be 2024-08-03 12:21:15, got %v", ival2)
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值