Go 字符串时间等相互转化以及时间加减等操作

1.获取当前时间的第二天零点时间,以及获取当前的23:59:59 的时间戳和date类型:

package main

import (
	"fmt"
	"time"
)

func main(){
	timeStr := time.Now().Format("2006-01-02")
	fmt.Println(timeStr)
	//使用Parse 默认获取为UTC时区 需要获取本地时区 所以使用ParseInLocation
	t2, _ := time.ParseInLocation("2006-01-02", timeStr, time.Local)
	//获取当前时间的第二天零点时间
	tomorrowFirstMoment2 := t2.AddDate(0, 0, 1)
	fmt.Println(tomorrowFirstMoment2)

	//获取时间戳
	sjc := tomorrowFirstMoment2.Unix()
	//必须先将时间戳转为time.Duration才能与time.Second相乘
	d := time.Duration(sjc)*time.Second
	now := time.Now().Unix()
	//计算距离当前时间还有多少纳秒
	fmt.Println(int64(d-time.Duration(now*1000000000)))

	var nowTime = time.Now()
	//获取当前时间的第二天零点时间
	var tomorrowFirstMoment = time.Date(nowTime.Year(), nowTime.Month(), nowTime.Day()+1, 0, 0, 0, 0, nowTime.Location())
	fmt.Println(tomorrowFirstMoment)
	//计算距离当前时间还有多少纳秒
	var d2 = tomorrowFirstMoment.Sub(nowTime)
	fmt.Println(int64(d2))

	//获取当天的23:59:59
	todayyLastMoment, _ := time.ParseInLocation("2006-01-02 15:04:05", timeStr+" 23:59:59", time.Local)
	fmt.Println(todayyLastMoment)
	//计算距离当前时间还有多少纳秒
	var d3 = todayyLastMoment.Sub(nowTime)
	//直接用print的话就不用强转为int64
	print(d3)

}

结果:

2022-04-19
2022-04-20 00:00:00 +0800 CST
49780000000000
2022-04-20 00:00:00 +0800 CST
49779126196000
2022-04-19 23:59:59 +0800 CST
49778126196000
Process finished with exit code 0

从结果可以看出第二天零点和今晚的23:59:59与当前时间相减结果是一样的,不应该有1秒之差吗?

时间解析容易踩坑的地方:

time.Parse转化时间使用的是UTC时间,所以会自动加8小时,需要改为 time.ParseInLocation()使用的是cst时间,输出时间正确:

package main

import (
	"fmt"
	"time"
)

func main(){
	t := time.Now().Unix()
	d := time.Unix(t, 0).Format("2006-01-02 15:04:05")
	tt, _ := time.Parse("2006-01-02 15:04:05", d)
	println("===========================")
	println("当前时间戳:", t)
	println("Parse从日期得到时间戳:", tt.Unix())  //多出了8小时
	tt3, _ := time.ParseInLocation("2006-01-02 15:04:05", d, time.Local)
	println("ParseInLocation从日期得到时间戳:", tt3.Unix()) //时间并没有增加8小时

	now := time.Now()
	fmt.Println("当前时间:", now)
	startDate := "2022-06-01 10:00:00"
	startTime1, _ := time.Parse("2006-01-02 15:04:05", startDate)
	fmt.Println("startTime1时间:", startTime1)

	if now.After(startTime1)  {		//由于startTime1用Parse解析出来会增加8小时,所以为false
		println("now.After(startTime1)")
	}
	startTime2, _ := time.ParseInLocation("2006-01-02 15:04:05", startDate, time.Local)
	fmt.Println("startTime2时间:", startTime2)

	if now.After(startTime2)  {
		println("now.After(startTime2)")
	}
}

结果:

===========================
当前时间戳: 1654070070
Parse从日期得到时间戳: 1654098870
ParseInLocation从日期得到时间戳: 1654070070
当前时间: 2022-06-01 15:54:30.526927 +0800 CST m=+0.000301414
startTime1时间: 2022-06-01 10:00:00 +0000 UTC
startTime2时间: 2022-06-01 10:00:00 +0800 CST
now.After(startTime2)

常见时间格式转化:

package main

import (
	"fmt"
	"time"
)

func main(){

	t := int64(1650344950)      //外部传入的时间戳(秒为单位),必须为int64类型
	t1 := "2022-04-19 10:22:30" //外部传入的时间字符串
	timeNow := time.Now()

	//时间转换的模板,golang里面只能是 "2006-01-02 15:04:05" (go的诞生时间)
	timeTemplate1 := "2006-01-02 15:04:05" //常规类型
	timeTemplate2 := "2006/01/02 15:04:05" //其他类型
	timeTemplate3 := "2006-01-02"          //其他类型
	timeTemplate4 := "15:04:05"            //其他类型
	timeTemplate5 := "15"            //获取 当前时间的 时
	timeTemplate6 := "04"            //获取 当前时间的 分
	timeTemplate7 := "05"            //获取 当前时间的 秒

	// ======= 将时间戳格式化为日期字符串 =======
	fmt.Println(time.Unix(t, 0).Format(timeTemplate1)) //输出:2022-04-19 13:09:10
	fmt.Println(time.Unix(t, 0).Format(timeTemplate2)) //输出:2022/04/19 13:09:10
	fmt.Println(time.Unix(t, 0).Format(timeTemplate3)) //输出:2022-04-19
	fmt.Println(time.Unix(t, 0).Format(timeTemplate4)) //输出:13:09:10
	fmt.Println(time.Unix(t, 0).Format(timeTemplate5)) //输出:13
	fmt.Println(time.Unix(t, 0).Format(timeTemplate6)) //输出:09
	fmt.Println(time.Unix(t, 0).Format(timeTemplate7)) //输出:10

	// ======= 将时间字符串转换为时间戳 =======
	stamp, _ := time.ParseInLocation(timeTemplate1, t1, time.Local) //使用parseInLocation将字符串格式化返回本地时区时间
	fmt.Println(stamp)  //2019-01-08 13:50:30 +0800 CST
	fmt.Println(stamp.Format(timeTemplate1)) //输出:2022-04-19 10:22:30
	fmt.Println(stamp.Format(timeTemplate2)) //输出:2022/04/19 10:22:30
	fmt.Println(stamp.Format(timeTemplate3)) //输出:2022-04-19
	fmt.Println(stamp.Format(timeTemplate4)) //输出:10:22:30
	fmt.Println(stamp.Format(timeTemplate5)) //输出:10
	fmt.Println(stamp.Format(timeTemplate6)) //输出:22
	fmt.Println(stamp.Format(timeTemplate7)) //输出:30
	fmt.Println(stamp.Unix())  //输出:1546926630


	fmt.Println(timeNow)  //2022-04-19 10:25:33.674693 +0800 CST m=+0.000083549
	fmt.Println(timeNow.Format(timeTemplate1)) //输出:2022-04-19 10:25:33
	fmt.Println(timeNow.Format(timeTemplate2)) //输出:2022/04/19 10:25:33
	fmt.Println(timeNow.Format(timeTemplate3)) //输出:2022-04-19
	fmt.Println(timeNow.Format(timeTemplate4)) //输出:10:25:33
	fmt.Println(timeNow.Format(timeTemplate5)) //输出:10
	fmt.Println(timeNow.Format(timeTemplate6)) //输出:25
	fmt.Println(timeNow.Format(timeTemplate7)) //输出:33


}

结果:

2022-04-19 13:09:10
2022/04/19 13:09:10
2022-04-19
13:09:10
13
09
10
2022-04-19 10:22:30 +0800 CST
2022-04-19 10:22:30
2022/04/19 10:22:30
2022-04-19
10:22:30
10
22
30
1650334950
2022-04-19 10:31:13.363526 +0800 CST m=+0.000091492
2022-04-19 10:31:13
2022/04/19 10:31:13
2022-04-19
10:31:13
10
31
13

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值