前言
也做过几次需要使用到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))
执行效果.png
2.1.3 注意点
这个函数接触的不多,真正开发过程中很少有用到,百度一下,需要注意的是os.clock()有可能返回负值,原因是这个函数是用C来实现的,数字溢出会进行截断导致出现负数,而且在某些平台实现clock()和C标准不一样,会返回负值。
摘抄自网络
看看这个值,妈呀,这么大都还是正常的,那么如果要在这个CPU使用时间还用os.clock(),那还不如自己用时间戳在开始使用的时候记录下时间,然后要用的时候自己进行减法,误差也不会很大,所以只推荐用来计算某段代码执行消耗了多少时间。
2.2 os.execute
2.2.1 简介和执行
os.execute(cmd)
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秒)的秒数,也就是时间戳。
随便运行下
2.3.2 用法
时间戳的作用,那就多了去了,这是个神奇的东西
- 完全可以实现上面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")
end
end
dosomethings({"起床", "刷牙", "洗脸", "上班", "加油"})
执行结果.png
2.4 os.date
2.4.1 简介和执行
首先,我记录os这个库的原因,就是因为这个函数,每次使用都要去百度上查一次,很麻烦,所以自己记录下,这个函数会写得比较多。
os.date(fmt, timestamp)
第一个参数是时间格式,默认为"%y%m%d %H:%M:%S",第二个参数是时间戳对应的number值,timestamp可以不传,默认为当前时间戳,即os.time()
随便运行下
2.4.2 用法
- 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)
end
os.date("*t")
- 根据需要的格式获取对应日期值
格式符 | 含义 | 具体示例(范围均为闭区间) |
---|---|---|
%a | 一星期中天数的简写 | Sat |
%A | 一星期中天数的全称 | Saturday |
%b | 月份的简写 | Dec |
%B | 月份的全称 | December |
%c | 日期和时间 | 12/02/17 14:42:07 (注解:17年12月2日) |
%d | 一个月中的第几天 | 02 范围:(01-31) |
%H | 小时制中的小时数 | 14[00 - 23] |
%I | 12小时制中的小时数 | 02[01 - 12] |
%M | 分钟数 | 42[00 - 59] |
%m | 月份数 | 12[01 - 12] |
%P | 上午或下午 | (pm) [ {am, pm}] |
%w | 一星期中的第几天 | 6[0 - 6 = 星期天 - 星期六] |
%W | 一年中的第几个星期 | 48 |
%x | 日期 | 12/02/17 |
%X | 时间 | 14:42:07 |
%y | 两位数的年份 | 17[00 - 99] |
%Y | 完整的年份 | 2017 |
%% | 字符串'%' | % |
示例
local fmt = [[
%%a = %a, 一星期中天数的简写
%%A = %A, 一星期中天数的全称
%%b = %b, 月份的简写
%%B = %B, 月份的全称
"%% = %c, 日期和时间"
%%d = %d, 一个月中的第几天
%%H = %H, 小时制中的小时数
%%I = %I, 12小时制中的小时数
%%M = %M, 分钟数
%%m = %m, 月份数
%%p = %p, 上午或下午
%%w = %w, 一星期中的第几天
%%W = %W, 一年中的第几个星期
%%x = %x, 日期
%%X = %X, 时间
%%y = %y, 两位数的年份
%%Y = %Y, 完整的年份
%%%% = %%, 字符串%%
]]
print(os.date(fmt))
运行结果
看完上面,表示这个东西,好强大,感觉需要的东西都在这里面了。这里郑重表示下,我写这篇东西,就是因为看一篇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
- os.setlocale : http://www.jianshu.com/p/6c7d1476fe05
- os.tmpname : http://www.jianshu.com/p/ba1c2e89dca5
网友评论