Go语言_时间篇
Go的time包是标准库中的包之一
不用说,几乎是开发必须用到的包之一。time包的说明文档在:
先注意下Overview中的一句话:
The calendrical calculations always assume a Gregorian calendar.
这个包的时间计算式是基于格里历,就是我们使用的公历。关于格里历的历史,可以看百度百科:
http://baike.baidu.com/view/391054.htm
看看godoc文档,最大的数据类型就是Time了,这个Time类型最微小可以表示到nanosecond(微毫秒,十亿份之一秒)。
Time的比较是使用Before,After和Equal方法。看一眼After:
func (t Time) After(u Time) bool
很好,返回的是bool类型,是我们所需要的。
Sub方法返回的是两个时间点之间的时间距离,看上图看到它返回的是Duration结构,这个结构的具体类型和操作也在godoc中
Add方法和Sub方法是相反的,获取t0和t1的时间距离d是使用Sub,将t0加d获取t1就是使用Add方法
IsZero方法:Time的zero时间点是January 1, year 1, 00:00:00 UTC,这个函数判断一个时间是否是zero时间点
Local,UTC,Ln是用来显示和计算地区时间的。
下面从几个需求直接看time的使用
1 请打出当前时间的时间戳,然后将时间戳格式为年月日时分秒的形式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package main import ( "fmt" "time" ) func main() { //时间戳 t := time.Now().Unix() fmt.Println(t) //时间戳到具体显示的转化 fmt.Println(time.Unix(t, 0 ).String()) //带纳秒的时间戳 t = time.Now().UnixNano() fmt.Println(t) fmt.Println( "------------------" ) //基本格式化的时间表示 fmt.Println(time.Now().String()) fmt.Println(time.Now().Format( "2006year 01month 02day" )) } |
显示:
特别是Format这个函数,可以好好使用
2 输出当前星期几?
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package main import ( "fmt" "time" ) func main() { //时间戳 t := time.Now() fmt.Println(t.Weekday().String()) } |
文档中对这个Weekday类型就没有说明!!没法,直接看代码可以看到:
Weekday有一个String()方法
好了,看到这里外带我们有一个推测:
当一个结构中有定义String()函数的时候,fmt.Println()是会调用String的
例子如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package main import ( "fmt" ) type MyStruct struct{ } func (d MyStruct)String() string { return "mystruct" } func main() { me := new (MyStruct) fmt.Println(me) } |
Go的Time之旅结束!!
go语言的time包
组成
- time.Duration(时长,耗时)
- time.Time(时间点)
- time.C(放时间点的管道)[ Time.C:=make(chan time.Time) ]
time包里有2个东西,一个是时间点,另一个是时长
时间点的意思就是“某一刻”,比如 2000年1月1日1点1分1秒 那一刻(后台记录的是unix时间,从1970年开始计算)
时长就是某一刻与另一刻的差,也就是耗时
函数
Sleep函数
time.Sleep(time.Duration)
表示睡多少时间,睡觉时,是阻塞状态
fmt.Println("start sleeping...")
time.Sleep(time.Second)
fmt.Println("end sleep.")
//【结果】打印start sleeping后,等了正好1秒后,打印了end sleep
//会阻塞,Sleep时,什么事情都不会做
After函数
time.After(time.Duration)
和Sleep差不多,意思是多少时间之后,但在取出管道内容前不阻塞
fmt.Println("the 1")
tc:=time.After(time.Second) //返回一个time.C这个管道,1秒(time.Second)后会在此管道中放入一个时间点(time.Now())
//时间点记录的是放入管道那一刻的时间值
fmt.Println("the 2")
fmt.Println("the 3")
<-tc //阻塞中,直到取出tc管道里的数据
fmt.Println("the 4")
//【结果】立即打印123,等了1秒不到一点点的时间,打印了4,结束
//打印the 1后,获得了一个空管道,这个管道1秒后会有数据进来
//打印the 2,(这里可以做更多事情)
//打印the 3
//等待,直到可以取出管道的数据(取出数据的时间与获得tc管道的时间正好差1秒钟)
//打印the 4
fmt.Println("the 1")
tc:=time.After(time.Second * 2) //返回一个time.C这个管道,2秒(time.Second × 2)后会在此管道中放入
//一个时间点(time.Now()),时间点记录的是放入管道那一刻的时间值
fmt.Println("the 2")
fmt.Println("the 3")
time.Sleep(time.Second)//这里是假设这个Println动作执行了半秒钟
fmt.Println("the 4")
time.Sleep(time.Second)//这里是假设这个Println动作执行了半秒钟
fmt.Println("the 5")
fmt.Println("the 6")
fmt.Println("the 7")
<-tc //阻塞中,直到取出tc管道里的数据
fmt.Println("the 8")
//【结果】立即打印1和2和3,等了1秒打印了4,打完后又等了1秒打印了5,然后又立即打印了678,结束
//这里的<-tc是立即能获得数据的
//因为早在执行差不多Print 5的时候,管道内已经有数据了
//当gorotine线把数据丢到管道中后,它自己阻塞了(具体请了解goroutine)
AfterFunc函数
time.AfterFunc(time.Duration,func())
和After差不多,意思是多少时间之后在goroutine line执行函数
f := func() {
fmt.Println("Time out")
}
time.AfterFunc(1*time.Second, f)
time.Sleep(2 * time.Second) //要保证主线比子线“死的晚”,否则主线死了,子线也等于死了
//【结果】运行了1秒后,打印出timeout,又过了1秒,程序退出
//将一个间隔和一个函数给AfterFunc后
//间隔时间过后,执行传入的函数
由于f函数不是在Main Line执行的,而是注册在goroutine Line里执行的
所以一旦后悔的话,需要使用Stop命令来停止即将开始的执行,如果已经开始执行就来不及了
houhui := true
f := func() {
fmt.Println("Time out")
}
ta := time.AfterFunc(2*time.Second, f)
time.Sleep(time.Second)
if houhui {
ta.Stop()
}
time.Sleep(3 * time.Second) //要保证主线比子线“死的晚”,否则主线死了,子线也等于死了
//【结果】运行了3秒多一点点后,程序退出,什么都不打印
//注册了个f函数,打算2秒后执行
//过了1秒后,后悔了,停掉(Stop)它
Tick函数
time.Tick(time.Duration)
和After差不多,意思是每隔多少时间后,其他与After一致
fmt.Println("the 1")
tc:=time.Tick(time.Second) //返回一个time.C这个管道,1秒(time.Second)后会在此管道中放入一个时间点,
//1秒后再放一个,一直反复,时间点记录的是放入管道那一刻的时间
for i:=1;i<=2;i++{
<-tc
fmt.Println("hello")
}
//每隔1秒,打印一个hello
time.Time的方法(time.Time自己独有的函数)
Before & After方法
判断一个时间点是否在另一个时间点的前面(后面),返回true或false
t1:=time.Now()
time.Sleep(time.Second)
t2:=time.Now()
a:=t2.After(t1) //t2的记录时间是否在t1记录时间的**后面**呢,是的话,a就是true
fmt.Println(a) //true
b:=t2.Before(t1) //t2的记录时间是否在t1记录时间的**前面**呢,是的话,b就是true
fmt.Println(b) //false
Sub方法
两个时间点相减,获得时间差(Duration)
t1:=time.Now()
time.Sleep(time.Second)
t2:=time.Now()
d:=t2.Sub(t1) //时间2减去时间1
fmt.Println(d) //打印结果差不多为1.000123几秒,因为Sleep无法做到精确的睡1秒
后发生的时间 减去 先发生时间,是正数
Add方法
拿一个时间点,add一个时长,获得另一个时间点
t1:=time.Now() //现在是12点整(假设),那t1记录的就是12点整
t2:=t1.Add(time.Hour) //那t1的时间点 **加上(Add)** 1个小时,是几点呢?
fmt.Println(t2) //13点(呵呵)
Go语言_时间篇的更多相关文章
- 怎样让Oracle支持中文? 语言_地域.字符集
暂时不涉及数据库业务,但是今天入库的时候中文入库报错,考虑可能是字体不支持,留待备用. 来源:Linux社区 作者:robertkun 语言_地域.字符集SIMPLIFIED CHINESE_CHI ...
- c语言_常见图片格式判断
c语言_常见图片格式判断 我想尽各种思路.今天,终于把图片判断搞定了. 在此,我写一下我的思路.希望对那些不想看代码的朋友们有帮助. 常风的的图片格式有:bmp,png,jpg,gif等图片格式. 我 ...
- BZOJ_1212_[HNOI2004]L语言_哈希
BZOJ_1212_[HNOI2004]L语言_哈希 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写 ...
- 选择排序_C语言_数组
选择排序_C语言_数组 #include <stdio.h> void select_sort(int *); int main(int argc, const char * argv[] ...
- 插入排序_C语言_数组
插入排序_C语言_数组 #include <stdio.h> void insertSort(int *); int main(int argc, const char * argv[]) ...
- 快速排序_C语言_数组
快速排序_C语言_数组 #include <stdio.h> void quickSort(int *, int, int); int searchPos(int *, int, int) ...
- 冒泡排序_C语言_数组
冒泡排序_C语言_数组 #include <stdio.h> //冒泡排序 小->大 void sort(int * pArray, int len); int main(int a ...
- 3.1 C语言_实现AVL平衡二叉树
[序] 上节我们实现了数据结构中最简单的Vector,那么来到第三章,我们需要实现一个Set set的特点是 内部有序且有唯一元素值:同时各种操作的期望操作时间复杂度在O(n·logn): 那么标准的 ...
- 2.2 C语言_实现数据容器vector(排序功能)
上一节我们说到我们己经实现了一般Vector可以做到的自动扩充,告诉随机存取,那么现在我们需要完成vector的一个排序的功能. 排序算法我们网上一百度哇~~!很常见的就有8大排序算法: 1.选择排序 ...
随机推荐
- C语言使用宏实现2个变量的交换
记录哪个方法更普适,更高效,这些方法不包括使用函数的方法,如果使用函数的话,使用指针的方法更合适. 使用中间变量 形如 int tmp, tmp = a; a=b; b = tmp; #define ...
- html之大白
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 【软件使用】GitHub使用教程for VS2012
一直以来都想使用Git来管理自己平时积累的小代码,就是除了工作之外的代码了.有时候自己搞个小代码,在公司写了,就要通过U盘或者网盘等等一系列工具进行Copy,然后回家才能继续在原来的基础上作业.Cop ...
- win8程序开机自启动管理
主要介绍利用系统自身的工具来管理开机自启动,而非第三方的工具,自己了解了,也写出来分享给大家@.·.@ 1.程序设置开机自启动 a. 打开计算机资源管理器-->进入"C:\Progra ...
- Zero
Zero是我的极品现任BOSS曾用过的QQ昵称.那时候,我正跟京姑娘闹七年之痒,甩她而去赋闲在老家.Zero通过朋友介绍,看了我几篇零散的博客,就给我打电话,让我过来聊聊.本来我跟京姑娘也没有大矛盾, ...
- PHP基本知识
PHP是以一种嵌入在HTML代码中的脚本语言,它由服务器负责解释,可以用于管理动态内容.支持数据库.处理会话跟踪.甚至构建整个电子商务站点. PHP支持许多流行.非流行的数据库,包括MySQL.Pos ...
- 链表面试题Java实现【重要】
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- RDLC直接打印帮助类
代码 /// <summary> /// 打印帮助类 /// </summary> public class PrintHelper { private int m_curre ...
- Nuget如何管理本地的包
1.在nuget中创建一个本地的程序包源
- javascript限制上传文件大小
在FireFox.Chrome浏览器中可以根据document.getElementById(“id_file”).files[0].size 获取上传文件的大小(字节数)使用的 api是FileRe ...