gounix转化为time_Go语⾔基础(九)
Go语⾔基础(九)
⼀、Time包
⼆、输出⽇志
三、反射
⼀、Time包
1、time.Now()获取当前时间对象
func timeNow() {
now := time.Now()
fmt.Println(now)
fmt.Println(now.Year())
fmt.Println(now.Month())
fmt.Println(now.Day())
fmt.Println(now.Date())
fmt.Println(now.Hour())
fmt.Println(now.Minute())
fmt.Println(now.Second())
}
输出结果
2、时间戳
时间戳是⾃1970年1⽉1⽇(08:00:00GMT)⾄当前时间的总毫秒数,它也成为了Unix时间戳。
func unixTimeStamp() {
now := time.Now()
timeStamp1 := now.Unix()
timeStamp2 := now.UnixNano()
fmt.Printf("current timestamp1:%vn", timeStamp1)
fmt.Printf("current timestamp2:%vn", timeStamp2)
// 使⽤time.Unix()函数可以将时间戳转换为时间格式。
ret := time.Unix(timeStamp1, 0)
fmt.Println(ret)
fmt.Println(ret.Year())
fmt.Println(ret.Month())
fmt.Println(ret.Day())
}
使⽤time.Unix()函数可以将时间戳转换为时间格式。
3、时间间隔
Duration类型表⽰两个时间点之间经历的时间,以纳秒为单位,可表⽰的最⼤时间段约为290年,time包中⾃定义的时间间隔常量如下:
4、时间操作
a、Add
b、Sub
func timeOp() {
now := time.Now()
fmt.Println(now.Add(24 * time.Hour))
// fmt.Println(now.Sub(time.Minute))
}
c、Equal,判断两个时间是否相同,考虑时区的影响。
c、Equal,
d、Before
func (t Time) Before(u Time) bool
如果t代表的时间点在u之前,返回真,否则返回假。
unix时间戳转换日期格式e、After
func (t Time) After(u Time) bool
如果t代表的时间点在u之后,返回真,否则返回假。
5、定时器
使⽤time.Tick(时间间隔)来设置定时器,定时器本质上是⼀个通道channel。
func timeTick() {
timer := time.Tick(time.Second)
for t := range timer {
fmt.Println(t)
}
}
6、时间格式化
时间类型有⼀个⾃带的⽅法Format进⾏格式化,需要注意的是Go语⾔中格式化时间不是常见的Y-m-d H:M:S⽽是使⽤Go语⾔诞⽣时间2006年1⽉2号15点04分(记忆⼝诀2006 1 2 3 4)。
注意:如果想格式化为12⼩时制,需指定PM。
func formatTime() {
now := time.Now()
// 格式化的模板为Go语⾔诞⽣时间2006-01-02 15:04:05 Mon Jan
// 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 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"))
}
7、时区
package main
import (
"fmt"
"time"
)
func f2()  {
now := time.Now()
fmt.Println(now)
// 明天这个时间
time.Parse("2006-01-02 15:04:05", "2019-08-04 21:16:00")
// 按照东⼋区的时区和格式解析⼀个字符串格式的时间
// 根据字符串加载时区
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Printf("location loc failed, err:%v", err)
return
}
// 按照指定时区解析时间
timeObj, err := time.ParseInLocation("2006-01-02 15:04:05", "2020-02-07 21:24:00", loc) if err != nil {
fmt.Printf("parse time failed, err:%v", err)
return
}
fmt.Println(timeObj)
// 对象时间相减
td := timeObj.Sub(now)
fmt.Println(td)
}
func main()  {
f2()
}
⼆、输出⽇志
简单⽰例:
package main
import (
"fmt"
"log"
"os"
"time"
)
func main() {
fileObj, err := os.OpenFile("./xx.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil {
fmt.Printf("open file failed, err:%v", err)
return
}
// log.SetOutPut(os.stdout)
log.SetOutput(fileObj)
for {
log.Printf("这是⼀条普通⽇志")
time.Sleep(time.Second * 3)
}
}
1、⽇志库需求分析
a、⽀持往不同的地⽅输出⽇志
b、⽇志分级,Debug、Trace、Info、Warning、Error、Fatal
c、⽇志要⽀持开关控制
d、⽇志要有时间、⾏号、⽂件名、⽇志级别、⽇志信息
e、⽇志要切割
按⽂件⼤⼩切割,每次记录⽇志之前都判断⼀下当前写的这个⽂件⼤⼩
按⽇期分割,在⽇志结构体中设置⼀个字段记录上次切割的⼩时数
在写⽇志之前检查⼀下当前⼩时数和之前保存的是否⼀致,不⼀致就要切割2、runtime.Caller()
package main
import (
"fmt"
"runtime"
)
func f1() {
// 把0分别改成1,2试试
pc, file, line, ok := runtime.Caller(2)
if !ok {
fmt.Println("runtime callback failed")
return
}
fmt.Println(pc)
funcName := runtime.FuncForPC(pc).Name()
fmt.Println(funcName)
fmt.Println(file)
fmt.Println(path.Base(file))
fmt.Println(line)
}
func f() {
f1()
}
func main() {
f()
}
3、实现往终端输出⽇志
package mylogger
import (
"errors"
"fmt"
"path"
"runtime"
"strings"
"time"
)
/
/ ⽇志级别