ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【Golang】日期与时间

2020-09-20 10:02:42  阅读:284  来源: 互联网

标签:fmt Time Golang 日期 时间 func time Println now



阅读目录

一、Time

二、常用时间总结

三、定时器

一、Time

//时间类型
func testTime(){
	now := time.Now()
	fmt.Println(now)
	fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())
}

//时间戳
func testTimestamp(){
	now := time.Now()
	timestamp1 := now.Unix()        //时间戳
	timestamp2 := now.UnixNano()    //纳秒时间戳
	fmt.Printf("current timestamp1:%v\n", timestamp1)
	fmt.Printf("current timestamp2:%v\n", timestamp2)
}

//时间转换
func testTimeTransform(){
	timestamp := time.Now().Unix()  //时间戳
	//时间戳转时间类型
	unix := time.Unix(timestamp, 0)
	fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", unix.Year(), unix.Month(), unix.Day(), unix.Hour(), unix.Minute(), unix.Second())
}

//时间操作
func testTimeOperate(){
	//add
	now := time.Now()
	newTime := now.Add(time.Hour)
	fmt.Println(newTime)

	//sub
	newTimeDuration := newTime.Sub(now)
	//返回一个时间区
	fmt.Println(newTimeDuration)
}

//时间格式化
func testTimeFormatAndParse(){
	now := time.Now()
	// 24小时制
	fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))
	// 12小时制
	fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan"))
	fmt.Println(now.Format("2006/01/02 15:04"))
	fmt.Println(now.Format("15:04 2006/01/02"))
	fmt.Println(now.Format("2006/01/02"))

	//默认UTC时间
	//t, _ := time.Parse("2006-01-02 15:04:05", "2020-05-07 09:14:00")
	t, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-05-07 10:30:52", time.Local)

	fmt.Println(t)
	fmt.Println(time.Now().Sub(t).Hours())
}

//时区
func testTimezone(){
	now := time.Now()
	fmt.Println(now)
	// 加载时区
	loc, err := time.LoadLocation("Asia/Shanghai")
	if err != nil {
		fmt.Println(err)
		return
	}
	// 按照指定时区和指定格式解析字符串时间
	timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2020/05/07 10:31:20", loc)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(timeObj)
	fmt.Println(timeObj.Sub(now))
}

//对于 json,使用的是 time.RFC3339Nano 这种格式。通常程序中不使用这种格式。解决办法是定义自己的类型。
type oftenTime time.Time

func(o oftenTime) MarshalJSON() ([]byte, error) {
	t := time.Time(o)
	//判断类型
	if y := t.Year(); y < 0 || y >= 10000 {
		return nil, errors.New("Time.MarshalJSON: year outside of range [0,9999]")
	}
	//JSON,双引号不能少
	return []byte(t.Format(`"2006-01-02 15:04:05"`)), nil
}

func testTimeJson(){
	o := oftenTime(time.Now())
	bytes, e := json.Marshal(o)
	fmt.Println(string(bytes), e)
}

//获取当前时间整点的 Time 实例
func testRoundAndTruncate(){
	fmt.Println(time.Now().Truncate(1 * time.Hour))
	fmt.Println(time.Now().Round(1 * time.Hour))

	t, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-05-08 10:30:52", time.Local)
	// 整点(向下取整)
	fmt.Println(t.Truncate(1 * time.Hour))
	// 整点(最接近)
	fmt.Println(t.Round(1 * time.Hour))

	// 整分(向下取整)
	fmt.Println(t.Truncate(1 * time.Minute))
	// 整分(最接近)
	fmt.Println(t.Round(1 * time.Minute))

	t2, _ := time.ParseInLocation("2006-01-02 15:04:05", t.Format("2006-01-02 15:00:00"), time.Local)
	fmt.Println(t2)
}

二、常用时间总结

//获取每月第一天
func GetFirstDateOfMonth(t time.Time) time.Time {
	t = t.AddDate(0, 0, -t.Day() + 1)
	return GetZeroTime(t)
}

func GetLastDateOfMonth(t time.Time) time.Time {
	return GetFirstDateOfMonth(t).AddDate(0, 1, -1)
}

//获取某一天的0点时间
func GetZeroTime(t time.Time) time.Time {
	return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
}
//获取是周几
func GetWeekDay(t time.Time) int {
	year, month, day  := t.Year(), int(t.Month()), t.Day()
	var weekday = [7]int{7, 1, 2, 3, 4, 5, 6}
	var y, m , c int
	if month >= 3 {
		m = month
		y = year % 100
		c = year / 100
	} else {
		m = month + 12
		y = (year - 1) % 100
		c = (year - 1) / 100
	}
	week := y + (y / 4) + (c / 4) - 2*c + ((26 * (m + 1)) / 10) + day - 1
	if week < 0 {
		week = 7 - (-week)%7
	} else {
		week = week % 7
	}
	return weekday[week]
}

//获取本周周日的日期
func GetLastDateOfWeek(t time.Time, fmtStr string) (dayStr string) {
	dayObj := GetZeroTime(t)
	if t.Weekday() == time.Sunday{
		dayStr = dayObj.Format(fmtStr)
	}else{
		dayStr = dayObj.AddDate(0, 0, 7-int(t.Weekday())).Format(fmtStr)
	}
	return
}

//获取本周周一的日期
func GetFirstDateOfWeek(t time.Time, fmtStr string) (dayStr string) {
	dayObj := GetZeroTime(t)
	if t.Weekday() == time.Monday {
		//修改hour、min、sec = 0后格式化
		dayStr = dayObj.Format(fmtStr)
	}else{
		offset := int(time.Monday - t.Weekday())
		if offset > 0 {
			offset = -6
		}
		dayStr = dayObj.AddDate(0, 0, offset).Format(fmtStr)
	}
	return
}

//获取上周周一日期
func GetLastWeekFirstDate(t time.Time, fmtStr string) (day string, err error) {
	monday := GetFirstDateOfWeek(t, fmtStr)
	dayObj, err := time.Parse(fmtStr, monday)
	if err != nil{
		return
	}
	day = dayObj.AddDate(0, 0, -7).Format(fmtStr)
	return
}
//获取上周最后一天
func GetLastWeekLastDate(t time.Time, fmtStr string) (day string, err error) {
	sunday := GetFirstDateOfWeek(t, fmtStr)
	dayObj, err := time.Parse(fmtStr, sunday)
	if err != nil{
		return
	}
	day = dayObj.AddDate(0, 0, -1).Format(fmtStr)
	return
}

三、定时器

1.Timer

//通过 time.After 模拟超时
func testTimerAfter(){
	c := make(chan int)

	go func() {
		//time.Sleep(1 * time.Second)
		time.Sleep(3 * time.Second)
		<-c
	}()

	select {
	case c <- 1:
		fmt.Println("channel...")
	case <-time.After(2 * time.Second):   //阻塞两秒钟
		close(c)
		fmt.Println("timeout...")
	}
}

//time.Stop 停止定时器 或 time.Reset 重置定时器
func testTimerReset(){
	start := time.Now()
	timer := time.AfterFunc(2*time.Second, func() {
		fmt.Println("after func callback, elaspe:", time.Now().Sub(start))
	})
	//time.Sleep(1 * time.Second)
	time.Sleep(3*time.Second)
	// Reset 在 Timer 还未触发时返回 true;触发了或 Stop 了,返回 false
	// Reset 会先调用 stopTimer 再调用 startTimer,类似于废弃之前的定时器,重新启动一个定时器。返回值和 Stop 一样。
	if timer.Reset(3 * time.Second) {
		fmt.Println("timer has not trigger!")
	} else {
		fmt.Println("timer had expired or stop!")
	}
	time.Sleep(10 * time.Second)
}

2.Tick

func testTickDemo() {
        //定义一个1秒间隔的定时器
	ticker := time.Tick(time.Second) 
	for i := range ticker {
		fmt.Println(i)
	}
}

3.定时器的实际应用

  • github.com/jasonlvhit/gocron
  • github.com/robfig/cron

标签:fmt,Time,Golang,日期,时间,func,time,Println,now
来源: https://www.cnblogs.com/zhangliang91/p/13698847.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有