前言
也做过几次需要使用到time和date的需求了,每次都要百度找一遍,感觉有点蛋疼,所以干脆花点时间研究并记录下这个时常要用到,但是又总是会忘记的这两个东西,刚好在os库里面,就干脆一起记录下来
申明下:这里面的东西我也是边学边记录的,如有错误,欢迎指出,谢谢。
一、开始研究
首先,要明白os库是什么:
os:操作系统(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。
二、Lua中的os库
话不多说,看标题就知道,既然是库,我们要用,知道接口就行了。
下面是从Lua官网上面找到的os库的对应接口。
os.clock 程序使用CPU时间的一个近似值
os.execute 执行命令
os.time 获取时间戳
os.date 根据参数返回对应格式的时间字符串
os.difftime 获取两个时间戳的差值
os.exit 退出
os.getenv 获取系统信息的函数
os.remove 删除文件或一个空目录
os.rename 更改一个文件或目录名
os.setlocale 设置程序的当前区域
os.tmpname 返回一个临时的文件名
2.1 os.clock
2.1.1 简介和执行
这是一个比较有意思的函数,我的感觉是类似Unity里面的Time.time,也就是这个程序从一开始就记住了程序开始的时间,然后调用这个函数的时候执行了当前时间减去开始时间,然后得出值并且返回出来。
2.1.2 用法
从上面可以看出,os.clock有和Time.time一样的作用,可以用来知道某段代码执行消耗了多少时间,从而对代码进行针对性的修改
-- This is test.lua
local start_time = os.clock()
print("100000000次循环开始时间 : " .. start_time)
for i = 1, 100000000 do end
local end_time = os.clock()
print("100000000次循环开始时间 : " .. end_time)
print("100000000次循环消耗时间 : " .. (end_time - start_time))
摘抄自网络
看看这个值,妈呀,这么大都还是正常的,那么如果要在这个CPU使用时间还用os.clock(),那还不如自己用时间戳在开始使用的时候记录下时间,然后要用的时候自己进行减法,误差也不会很大,所以只推荐用来计算某段代码执行消耗了多少时间。
2.2 os.execute
2.2.1 简介和执行
os.execute(cmd)
这是个很简单的函数了,就是在终端上执行命令,一般Unity开发中很少用到,很多语言也有类似这个作用的API供调用。
2.2.2 用法
开发过程中基本没用过,如果要用,根据它的定义,可以写脚本在终端执行命令,进行操作,不过,想想,这还不如直接写shell或者bat批处理来实现,还少了一层Lua。
2.3 os.time
2.3.1 简介和执行
os.time(date_tbl)
获取date_tbl这个表中存储(默认为当前时间)的时间距离格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)的秒数,也就是时间戳。
完全可以实现上面os.clock()的作用,只不过精确到秒,但是在一般情况基本是够用了的。
可以用来保存数据的唯一性,例如一个订单,可以在某个位置开始存储一个时间戳,到时候回看的时候一看就知道订单创建的时间。
可以存储在数据库中,用来存储用户某个操作的时间,例如,每日活动,用时间戳存储起来,然后再用等下要记录的os.date()获取日期,判断是否是同一天,进行对应的操作。
...........
-- This is test.lua
local function dosomethings(things)
for i = 1, #things do
print(string.format("you are %s at %d", things[i], os.time()))
-- cmd暂停1秒,-n 2表示发包两次,1秒1次
--直接执行的时候发了一个,所以发两个,即实现了暂停1秒的效果
os.execute("ping 127.0.0.1 -n 2 > nul")
dosomethings({"起床", "刷牙", "洗脸", "上班", "加油"})
2.4.1 简介和执行
首先,我记录os这个库的原因,就是因为这个函数,每次使用都要去百度上查一次,很麻烦,所以自己记录下,这个函数会写得比较多。
os.date(fmt, timestamp)
第一个参数是时间格式,默认为"%y%m%d %H:%M:%S",第二个参数是时间戳对应的number值,timestamp可以不传,默认为当前时间戳,即os.time()
os.date("t")
os.date("t", timestamp) ,返回timestamp(默认当前时间)的date_tbl,可以说是和os.time(date_tbl)相对应,这两个函数可以相互照应写一直执行来执行去。
-- This is test.lua
local date_tbl = os.date("*t")
for i, v in pairs(date_tbl) do
print(i .. " = ", v)
看完上面,表示这个东西,好强大,感觉需要的东西都在这里面了。这里郑重表示下,我写这篇东西,就是因为看一篇Lua Date的文章,里面少了一个%W,这个获取一年中第几个星期的解释,搞得我写了一个算法,提交上去,同事告诉我有这个东西,然后重新写了一遍,难受,所以才来记录的,百度上面没找到,但是,google上面找到了,这个坑,我会记住的。。。。
2.5 os.difftime
2.5.1 简介和执行
os.difftime (t2, t1),获取t1到t2之间的秒数差
看了上面这个,你还有什么其他想法吗,还要记住是前面那个减去后面那个,还不如我自己直接去减。如果有谁知道这东西有什么神奇的用法,欢迎评论。
接下来的东西就不自己写了,前面的东西其实也是我一路找过来的,只是那些都比较重要而且常用,所以还是自己记录下来了(os.clock除外,这个东西我也没用过几次),刚好写的时候边写边找,看到一个简书作者,写的都挺好,而且还结合了C,而且,接下来的几个函数他都有记录,干脆就引用下,写在文章最后,再次也鸣谢下作者AlbertS。
os.exit : http://www.jianshu.com/p/e2c8fd8ddc1b
os.getenv : http://www.jianshu.com/p/b974424b42ec
os.remove : http://www.jianshu.com/p/0db899bb2487
os.rename : http://www.jianshu.com/p/6c7d1476fe05