热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Golang】日期与时间

阅读目录一、Time二、常用时间总结三、定时器一、Time时间类型functestTime(){now:time.Now()fmt.Println(now)fmt.Printf(&

阅读目录

一、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

推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
author-avatar
曹lister_638
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有