(摘) golang之Time

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

获取当前时间戳

seconds := time.Now().Unix()

获取当前年月日时分和星期几

//获取当前时间的Time结构体实例
t := time.Now()
​
//通过Date函数同时获取年月日
year, month, day := t.Date()
//假设日期为2021-1-7 打印结果为 year:2021, month:1, day:7
fmt.Printf("year:%d, month:%d, day:%d\n", year, month, day)
​
//通过Clock函数同时获取时分秒
hour, minute, second := t.Clock()
//假设时间是18:51:9 打印结果 hour:18,minute:51,second:9
fmt.Printf("hour:%d,minute:%d,second:%d\n", hour, minute, second)
​
//也可以单独获取年、月、日、时、分、秒、星期几
year := t.Year() //获取所属年份
month := t.Month() //获取所属月份,不带前导零
day := t.Day() //获取所属日,不带前导零
hour := t.Hour() //获取当前小时
minutes := t.Minute() //获取当前分钟
seconds := t.Seconds() //获取当前描述
nanosecond := t.Nanosecond() //获取当前纳秒数
weekday := t.Weekday()  //获取是星期几, t.Weekday返回的是Weekday类型

返回当前时间是一年中的第几天

yearday := time.Now().YearDay()

时间戳格式化成日期字符串

// 1、将时间戳转换成int64类型
timestamps := int64(1609945385) //该时间戳代表2021-01-06 23:03:05
​
//2、将int64类型时间戳转换成Time结构,time.Unix函数的第2个参数代表纳秒数
t := time.Unix(timestamps, 0)
​
//3、调用Time结构体的Format函数,这里我们定义一组格式
var formats = []string{
    "2006年01月02日 15时04分05秒",
    "2006-01-02 15:04:05",
    "2006/01/02 15:04:05",
    "06-01-02",
    "06年01月02日",
    "2006.01.02",
    "06/1/2",
}
​
for _, layout := range formats {
    result := t.Format(layout)
    fmt.Printf("日期格式:%s, 转换结果:%s \n", layout, result)
}

计算两个日期之间相差

t1str := "2021-01-07 15:57:23"
t2str := "2021-01-07 18:57:23"
layout := "2006-01-02 15:04:05" //时间字符串的格式
//1、将时间字符串转换成Time类型
location, _ := time.LoadLocation("Asia/Shanghai")
t1 := time.ParseInLocation(layout, t1str, location)
t2 := time.ParseInLocation(layout, t2str, location)
​
//2、计算两个Time结构实例之间的差
d := t2.Sub(t1)
​
//3、根据返回的Duration类型的d转换成相应的小时/分钟/秒数
hours := d.Hours() //转换成两个时刻相差的小时数
minutes := d.Minutes() //转换成两个时刻相差的分钟数
seconds := d.Seconds() //转换成两个时刻相差的秒数
milliseconds := d.Milliseconds() //转换成两个时刻相差的毫秒数
microseconds := d.Microseconds() //转换成两个时刻相差的微妙数
nanoseconds := d.Nanoseconds() //转换成两个时刻相差的纳秒数

获取从某个时间 至今 经过的时间

t1str := "2014-10-02 13:14:15"
layout := "2006-01-02 15:04:05" //时间字符串的格式
​//1、将时间字符串转换成Time类型
location, _ := time.LoadLocation("Asia/Shanghai")
t := time.ParseInLocation(layout, t1str, location)
​
//2、计算两个Time结构实例之间的差
d := time.Since(t)
​
//2、根据返回的d转换成响应的小时/分钟/秒数
hours := d.Hours() //转换成两个时刻相差的小时数
minutes := d.Minutes() //转换成两个时刻相差的分钟数
seconds := d.Seconds() //转换成两个时刻相差的秒数
milliseconds := d.Milliseconds() //转换成两个时刻相差的毫秒数
microseconds := d.Microseconds() //转换成两个时刻相差的微妙数
nanoseconds := d.Nanoseconds() //转换成两个时刻相差的纳秒数
fmt.Printf("从%s至今你们一起度过了共%d", t1str, d.Round(24*time.Hour))
fmt.Printf("从%s至今共一起度过了%f小时\n", t1str, time.Now().Format(layout), hours)

计算从今天到未来某个时间经过的时间

t1str := "2021-12-21 13:14:15"
layout := "2006-01-02 15:04:05" //时间字符串的格式
//第1步,将时间字符串转换成Time类型
location, _ := time.LoadLocation("Asia/Shanghai")
t := time.ParseInLocation(layout, t1str, location)
​
//第2步,计算两个Time结构实例之间的差
d := time.Until(t)
​
//第3步,根据返回的d转换成响应的小时/分钟/秒数
hours := d.Hours() //转换成两个时刻相差的小时数
fmt.Printf("距女朋友生日%s还有%f小时\n", t1str, hours)

时间之间的比较:是早、是晚、还是相等相关函数

pivot := "2021-12-12 13:14:15"
layout := "2006-01-02 15:04:05" //时间字符串的格式
//第1步,将时间字符串转换成Time类型
location, _ := time.LoadLocation("Asia/Shanghai")
pivotT := time.ParseInLocation(layout, t1str, location)
​
//第2步,获取现在的时间
t := time.Now()
​
//第3步,和约定时间比较下是否来早了
if t.Before(pivotT) {
    fmt.Println("来早了")
}
​
//和约定时间比较一下,看是否来晚了
if t.After(pivotT) {
    fmt.Println("oh,糟糕,来晚了")
}
​
//和约定时间比较一下,一看,刚刚好
if t.Equal(pivotT) {
    fmt.Println("还好,还好,刚刚好")
}

计算N天后的时间

d := 3 * 24 * time.Hour​
afterNDay := time.Now().Add(d)​
fmt.Println("3天后的日期是", afterNDay.Format("2006-01-02"))

定时器

使用time.Tick(时间间隔)来设置定时器,定时器的本质上是一个通道(channel)。

func tickDemo() {
    ticker := time.Tick(time.Second) //定义一个1秒间隔的定时器
    for i := range ticker {
        fmt.Println(i)//每秒都会执行的任务
    }
}

时间戳转时间

timeStamp := 1569826535
t := time.Unix(int64(timeStamp), 0)  // time.Time
strTime := t.Format("2006-01-02 15:04:05")
fmt.Println(strTime)  // 2019-09-30 14:55:35

时间字符串转时间

s := "2019年9月30日 15:10:30"  // ---> 2019-09-30 15:10:30
t, err := time.Parse("2006年1月2日 15:4:5", s)
if err != nil {
    fmt.Println(err.Error())
}
result := t.Format("2006-01-02 15:04:05")
fmt.Println(result)

时间加减法

timeStamp := 1569826535             // 2019-09-30 14:55:35
t := time.Unix(int64(timeStamp), 0) // time.Time
  
// 时间年月日加减,如果是负数,怎表示减去多少
t2 := t.AddDate(0, -1, 0)
fmt.Println(t2.Format("2006/01/02 15:04:05"))
  
// 第二种写法,同样的是负数表示减法
t3 := t.Add(-time.Hour * 24)
fmt.Println(t3.Format("2006/01/02 15:04:05"))

其它

10位数的时间戳是以 秒 为单位;
13位数的时间戳是以 毫秒 为单位;
19位数的时间戳是以 纳秒 为单位;

const (
	Nanosecond  Duration = 1
	Microsecond          = 1000 * Nanosecond
	Millisecond          = 1000 * Microsecond
	Second               = 1000 * Millisecond
	Minute               = 60 * Second
	Hour                 = 60 * Minute
)

//Nanosecond表示1纳秒的时间间隔
//Microsecond表示1微妙的时间间隔
//Millisecond表示1毫秒的时间间隔
//Second表示1秒的时间间隔
//Minute表示1分钟的时间间隔
//Hour表示1小时的时间间隔

定时器

延时

time.NewTimer时间到了,只响应一次

func main() {
   //time.NewTimer时间到了,只响应一次
   //创建一个定时器,设置时间为2s,2s后,往time通道写内容(当前时间)
   timer := time.NewTimer(2 * time.Second)
   fmt.Println("当前时间: ", time.Now())
 
   //2s后,往timer.c写数据,有数据后,就可以读取
   t := <-timer.C //channel没有数据前后阻塞
   fmt.Println("t = ", t)
}

time.After(2 * time.Second)延迟多少秒产生个事件

    func main() {
       //定时2秒,2秒后产生一个事件,往channel里面写内容
       <-time.After(2 * time.Second)
       fmt.Println("时间到")
    }

停止

func main() {
 
   timer := time.NewTimer(3 * time.Second)
 
   go func() {
      <-timer.C
      fmt.Println("子协程可以打印了,因为定时器的时间到了")
   }()
 
   //关闭定时器
   timer.Stop()
   for {
 
   }
}

重置

func main() {
   timer := time.NewTimer(3 * time.Second)
   //重置上面的那个无效
   flag := timer.Reset(1 * time.Second)
   fmt.Println(flag)  //true
   <-timer.C
   fmt.Println("时间到")
}

###Ticker 定时触发的计时器,它会以一个间隔(interval)往channel发送一个事件(当前时间),而channel的接收者可以以固定的时间间隔从channel中读取事件

func main() {
 
   ticker := time.NewTicker(1 * time.Second)
   i := 0
   for {
      <-ticker.C
 
      i++
      fmt.Println("i = ", i)
 
      if i ==5 {
        //停止ticker
         ticker.Stop()
         break
      }
   }
}

相关文章