go 常用标准库之-time

文章目录

  • go 常用标准库之-time
    • 基本使用
    • 时间戳
    • 时间间隔
    • 时间操作
      • Add
      • Sub
      • Equal
      • Before
      • After
    • 时间格式化
    • 字符串格式化成时间
    • 时区
    • 定时任务

go 常用标准库之-time

基本使用

time.Time类型表示时间。我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息。

func main() {
	t := time.Now()
	fmt.Println(t)		// 2022-07-19 09:50:29.8980644 +0800 CST m=+0.003829601
	year := t.Year()     //年  
	month := t.Month()   //月
	day := t.Day()       //日
	hour := t.Hour()     //小时
	minute := t.Minute() //分钟
	second := t.Second() //秒
	fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)  // 2022-07-19 09:50:29
}
func main() {
	time.Sleep(3*time.Second)  // 沉睡3秒
}

时间戳

时间戳是自1970年1月1日(08:00:00GMT)计算机与阿年,至当前时间的总毫秒数。它也被称为Unix时间戳(UnixTimestamp)。

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

时间戳对象也可以通过time.Unix() 转为格式化时间对象,并且通过 .Format() 方法指定格式后输出

func main() {
	timestamp := time.Now().Unix()   
	tm := time.Unix(timestamp,0)   // timestamp 可以放 int64 位类型的数字作为时间戳  
	fmt.Printf(tm.Format("2006-01-02 03:04:05 PM"))    // 2022-07-19 09:57:03 AM
	fmt.Printf(tm.Format("02/01/2006 15:04:05 PM"))    // 19/07/2022 09:57:03 AM
}

时间间隔

time.Durationtime包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。time.Duration表示一段时间间隔,可表示的最长时间段大约290年。

time包中定义的时间间隔类型的常量如下:

const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
)
//time.Duration表示1纳秒,time.Second表示1秒。

时间操作

Add

时间相加

func (t Time) Add(d Duration) Time

举个例子,求24个小时之后的时间:

func main() {
	var now time.Time = time.Now()
	lastTime:=now.Add(24*time.Hour)
	fmt.Println(lastTime)
}

Sub

求两个时间之间的差

func (t Time) Sub(u Time) Duration

如果结果超出了Duration可以表示的最大值/最小值,将返回最大值/最小值。

要获取时间点Time-Duration,可以使用t.Add(-Duration)

计算俩时间对象的差,如果计算时间和时间间隔的差,使用Add

func main() {
	var start time.Time = time.Now()
	var end=time.Now()
	fmt.Println(end.Sub(start))
}

Equal

func (t Time) Equal(u Time) bool

判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。

本方法和用==(双等号)不同,这种方法还会比较地点和时区信息。

Before

func (t Time) Before(u Time) bool

如果t代表的时间点在u之前,返回真;否则返回假。

After

func (t Time) After(u Time) bool

如果t代表的时间点在u之后,返回真;否则返回假。

func main() {
	var start time.Time = time.Now()
	var end=time.Now()
	fmt.Println(end.Before(start))
	fmt.Println(end.After(start))
}

时间格式化

时间类型有一个自带的方法Format进行格式化,需要注意的是Go语言中格式化时间模板不是常见的Y-m-d H:M:S而是使用Go的诞生时间2006年1月2号15点04分(记忆口诀为2006 1 2 3 4)

- 2006代指年(Y)
- 01代指月(m)
- 02代指日(d)
- 15代指时(H)
- 04代指分(M)
- 05代指秒(S)

//如果想格式化为12小时方式,需指定PM
//小数部分想保留指定位数就写0,如果想省略末尾可能的0就写 9
func main() {
	var now time.Time = time.Now()
	fmt.Println(now.Format("2006-01-02"))
	fmt.Println(now.Format("2006年01月02日"))
	fmt.Println(now.Format("2006-01-02 15:02:05"))
	fmt.Println(now.Format("2006-01-02 03:04:05 PM"))
	// 小数点后写0,因为有4个0所以格式化输出的结果也保留4位小数
	fmt.Println(now.Format("2006-01-02 15:04:05.0000")) //2022-03-19 00:50:09.7412
	// 小数点后写9,如果末尾是0,会省略
	fmt.Println(now.Format("2006-01-02 15:04:05.9999")) 
	// 只格式化时分秒部分
	fmt.Println(now.Format("15:04:05"))
	// 只格式化日期部分
	fmt.Println(now.Format("2006.01.02"))

}

字符串格式化成时间

func main() {
	timeObj,err:=time.Parse("2006-01-02 15:04:05.9999","2022-03-19 00:10:42.96")
	if err != nil {
		fmt.Println("转换出错",err)
	}
	// 默认转成utc时间
	fmt.Println(timeObj)
	fmt.Println(timeObj.Year())
	fmt.Println(timeObj.Month())
	fmt.Println(timeObj.Day())
	fmt.Println(timeObj.Hour())
	fmt.Println(timeObj.Minute())
	fmt.Println(timeObj.Second())
	now:=time.Now()

	res:=now.Sub(timeObj)
	fmt.Println(res) // 当前时间减去转成的时间,发现差8个小时

	//time.ParseInLocation函数需要在解析时额外指定时区信息。
	// 按照指定时区和指定格式解析字符串时间
	loc, err := time.LoadLocation("Asia/Shanghai")
	timeObj2, err := time.ParseInLocation("2006-01-02 15:04:05", "2022-03-19 00:10:42", loc)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(timeObj2)
	res=now.Sub(timeObj2)
	fmt.Println(res) // 这个时间正常
}

时区

全球共分为24个时区。中国差不多跨5个时区,但为了使用方便只用东八时区的标准时即北京时间为准

func main() {
	shanghaiTime, err := time.LoadLocation("Asia/Shanghai") // 只支持重庆Asia/chongqin,上海Asia/Shanghai。。一些城市
	//tokyo, err := time.LoadLocation("Asia/Tokyo")
	if err != nil {
		fmt.Println("加载出错", err)
		return
	}
	fmt.Println(shanghaiTime)


	// 创建时间对象需要指定位置。常用的位置是 time.Local(当地时间) 和 time.UTC(UTC时间)。
	//timeInLocal := time.Date(2009, 1, 1, 20, 0, 0, 0, time.Local)  // 系统本地时间
	timeInUTC := time.Date(2022, 3, 15, 12, 3, 4, 0, time.UTC)
	sameTimeInBeijing := time.Date(2022, 3, 15, 20, 3, 4, 0, shanghaiTime)

	// 北京时间(东八区)比UTC早8小时,所以上面两个时间看似差了8小时,但表示的是同一个时间
	timesAreEqual := timeInUTC.Equal(sameTimeInBeijing)
	fmt.Println(timesAreEqual)

}

定时任务

定时任务请参考 go timer 一文

你可能感兴趣的:(#,go,基础,golang,unix,开发语言)