一、简介

  最近马三在工作中经常使用到了lua 中的 os.date( ) 和 os.time( )函数,不过使用的时候都是不得其解,一般都是看项目里面怎么用,然后我就模仿写一下。今天正好稍微有点空闲时间就好好地收集了一下相关资料并学习了一下,并将学习结果记录成此博客。

二、os.time和os.date函数说明

1.os.time()函数

  os.time()的函数原型与Lua官方的解释如下:

  

  如果没有任何参数,就会返回当前时间。如果参数一个table,并且table的域必须有 year, month, day, 可有也可以没有 hour, min, sec, isdst,则会返回table所代表日期的时间,如果未定义后几项,默认时间为当天正午(12:00:00)。 返回值是一个 number ,其值取决于你的系统。返回值通常被用于 os.date 和 os.difftime。

  具体的用法可以看下面几段代码样例:

print(os.time())
print(os.time({day=,month=,year=}))
print(os.date("%y/%m/%d, %H:%M:%S",os.time({day=,month=,year=})))

  其执行结果如下图所示:

  

  图1:os.time样例执行结果示意图

  os.time()函数的源码如下,可以仔细研读一下,对提高代码水平有帮助:

 static int os_time (lua_State *L) {
time_t t;
if (lua_isnoneornil(L, )) /* called without args? */
t = time(NULL); /* get current time */
else {
struct tm ts;
luaL_checktype(L, , LUA_TTABLE);
lua_settop(L, ); /* make sure table is at the top */
ts.tm_sec = getfield(L, "sec", );
ts.tm_min = getfield(L, "min", );
ts.tm_hour = getfield(L, "hour", );
ts.tm_mday = getfield(L, "day", -);
ts.tm_mon = getfield(L, "month", -) - ;
ts.tm_year = getfield(L, "year", -) - ;
ts.tm_isdst = getboolfield(L, "isdst");
t = mktime(&ts);
}
if (t == (time_t)(-))
lua_pushnil(L);
else
lua_pushnumber(L, (lua_Number)t);
return ;
}

2.os.date()函数

  os.date()函数的原型与Lua官方解释如下:

  

  第一个参数是时间的格式化参数,如果设置了则会按照固定的格式来格式化时间。若设置time参数,则按time指定的时间格式化,否则按当前时间格式化。如果format 以 ! 开始, date 会被格式化成协调世界时(Coordinated Universal Time) 。 *t 将返一个带year(4位), month(1-12), day (1--31), hour (0-23), min (0-59), sec (0-61), wday (星期几, 星期天为1), yday (年内天数), isdst (是否为日光节约时间true/false)的表。若没有*t则返回一个按C的strftime函数格式化的字符串  若不带参数,则按当前系统的设置返回格式化的字符串 os.date() <=> os.date("%c")。

  对于format参数,马三在这里给大家提供了一个列表,分别列出了各种format参数和对应的含义:

%a - Abbreviated weekday name (eg. Wed)
%A - Full weekday name (eg. Wednesday)
%b - Abbreviated month name (eg. Sep)
%B - Full month name (eg. September)
%c - Date and time representation appropriate for locale (eg. // ::)
(Standard date and time string ) - see below for using os.setlocale to get the correct locale.
%d - Day of month as decimal number ( - )
%H - Hour in -hour format ( - )
%I - Hour in -hour format ( - )
%j - Day of year as decimal number ( - )
%m - Month as decimal number ( - )
%M - Minute as decimal number ( - )
%p - Current locale’s A.M./P.M. indicator for -hour clock (eg. AM/PM)
%S - Second as decimal number ( - )
%U - Week of year as decimal number, with Sunday as first day of week ( - )
%w - Weekday as decimal number ( - ; Sunday is )
%W - Week of year as decimal number, with Monday as first day of week ( - )
%x - Date representation for current locale (Standard date string)
%X - Time representation for current locale (Standard time string)
%y - Year without century, as decimal number ( - ) (eg. )
%Y - Year with century, as decimal number (eg. )
%Z - Time-zone name or abbreviation; no characters if time zone is unknown
%% - Percent sign

  具体的用法,我们依然可以参考下面的几段代码样例:

 print("=================os.date test===============")
print(os.date())
print(os.date("%x",os.time()))
print(os.date("*t"))
print(os.date("*t").year)
print(os.date("*t").month)
print(os.date("*t").day)
print(os.date("*t").hour)
print(os.date("*t").wday)
-- 显示当前年份
print(os.date("%Y"))
-- 显示当前是一年中的第几周
print(os.date("%U"))
-- 组合格式化时间
print(os.date("%Y-%m-%d, %H:%M:%S",os.time()))

  其执行结果如下图所示:

  

  图2:os.date()样例函数执行结果示意图

  os.date( )函数源码如下:

 static int os_date (lua_State *L) {
size_t slen;
const char *s = luaL_optlstring(L, , "%c", &slen);
time_t t = luaL_opt(L, l_checktime, , time(NULL));
const char *se = s + slen; /* 's' end */
struct tm tmr, *stm;
if (*s == '!') { /* UTC? */
stm = l_gmtime(&t, &tmr);
s++; /* skip '!' */
}
else
stm = l_localtime(&t, &tmr);
if (stm == NULL) /* invalid date? */
luaL_error(L, "time result cannot be represented in this installation");
if (strcmp(s, "*t") == ) {
lua_createtable(L, , ); /* = number of fields */
setallfields(L, stm);
}
else {
char cc[]; /* buffer for individual conversion specifiers */
luaL_Buffer b;
cc[] = '%';
luaL_buffinit(L, &b);
while (s < se) {
if (*s != '%') /* not a conversion specifier? */
luaL_addchar(&b, *s++);
else {
size_t reslen;
char *buff = luaL_prepbuffsize(&b, SIZETIMEFMT);
s++; /* skip '%' */
s = checkoption(L, s, se - s, cc + ); /* copy specifier to 'cc' */
reslen = strftime(buff, SIZETIMEFMT, cc, stm);
luaL_addsize(&b, reslen);
}
}
luaL_pushresult(&b);
}
return ;
}

3.计算时间差

  在开发过程中我们经常遇到需要计算两个时间t1,t2的时间差这种需求,我们可以直接使用os.difftime( )这个自带的函数来完成,当然我们也可以自己实现一个符合自己要求的函数。例如,策划经常会在表格中配置一些活动/玩法的开启时间等,样式如下图所示:

  

  图3:时间差数据表示意图

  然后我们就可以利用下面的代码实现求时间差了,它会返回当前时间和配置时间相差的秒数:

 Split = function(szFullString,szSeprator)
local nFindStartIndex =
local nSplitIndex =
local nSplitArray = {}
while true do
local nFindLastIndex = string.find(szFullString,szSeprator,nFindStartIndex)
if not nFindLastIndex then
nSplitArray[nSplitIndex] = string.sub(szFullString,nFindStartIndex,string.len(szFullString))
break
end
nSplitArray[nSplitIndex] = string.sub(szFullString,nFindStartIndex,nFindLastIndex - )
nFindStartIndex = nFindLastIndex + string.len(szSeprator)
nSplitIndex = nSplitIndex +
end
return nSplitArray
end formatTime = function( timeStr )
local splited = Split(timeStr, ":")
local h = splited[]
local m = splited[]
return tonumber(h), tonumber(m)
end getRemainTime = function(timeStr)
local h1, m1 = formatTime(timeStr)
local curTime = os.date("*t", os.time())
local curH = curTime.hour
local curM = curTime.min local remainH = h1 - curH
local remainM = m1 - curM
local totalRemainSeCond = remainH * + remainM *
return totalRemainSeCond
end

三、总结

  对于一些lua中的源码我们可以到这里去下载并查看学习:传送门 。最近项目实在是太忙了,忙得晕头转向的,天天加班到深夜,真是哔了狗了。今天好不容易挤出点时间更新点东西,真鸡儿难受~

  本篇博客中的代码已经同步到Github:https://github.com/XINCGer/Unity3DTraining/tree/master/SomeTest/os_time 欢迎fork!

作者:马三小伙儿
出处:http://www.cnblogs.com/msxh/p/8955150.html 
请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!

【Unity游戏开发】Lua中的os.date和os.time函数的更多相关文章

  1. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)

    本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中 ...

  2. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)

    本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二) 前几天有点事情所以没有继续更新,今天我们接着说.上个帖子中我们看到已经把Excel数据生成了.bin的文件,不过其 ...

  3. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (四)2018.4.3更新

    本帖是延续的:C# Unity游戏开发--Excel中的数据是如何到游戏中的 (三) 最近项目不算太忙,终于有时间更新博客了.关于数据处理这个主题前面的(一)(二)(三)基本上算是一个完整的静态数据处 ...

  4. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一)

    引言 现在做游戏开发的没有几个不用Excel的,用的最多的就是策划.尤其是数值策划,Excel为用户提供强大的工具,各种快捷键,各种插件,各种函数.但是作为程序来说其实关注的不是Excel而是它最终形 ...

  5. 【Unity游戏开发】记一次解决 LuaFunction has been disposed 的bug的过程

    一.引子 RT,本篇博客记录的是马三的一次解决 LuaFunction has been disposed 的bug的全过程,事情还要从马三的自研框架 ColaFrameWork 说起.最近,马三在业 ...

  6. 【Unity游戏开发】浅谈Lua和C#中的闭包

    一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...

  7. 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher

    一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...

  8. 喵的Unity游戏开发之路 - 推球:游戏中的物理

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

  9. 关于Unity游戏开发方向找工作方面的一些个人看法

     这是个老生常谈,却又是谁绕不过去的话题,而对于每个人来说,所遇到的情况又不尽相同,别人的求职方式和路线不一定适合你,即使是背景很相似的两个人,有时候机遇也很重要. 我本人的工作经验只有一年,就业方式 ...

随机推荐

  1. JavaScript遍历XML总结

    1:读取服务器端xml(注意不同浏览器版本的区别),使用XML可以增强系统的扩展性,只用修改XML就可以实现增加减少功能的目的. function loadXMLDoc1(dname){     if ...

  2. java——多态

    多态定义:某一类事物的多种存在形态.对象的多态性.猫这类事物即具备猫的形态,又具备着动物的形态,这就是对象的多态性.简单说:就是一个对象对应着不同类型.多态在代码中的体现:父类或者接口的引用指向其子类 ...

  3. Python中的函数与变量

    本节内容 函数的定义方法 函数功能 函数的返回值 函数的形参与实参 全局变量与局部变量 递归 函数的作用域 匿名函数lambda 函数式编程 常用内置函数 其他内置函数 函数 函数的定义方法 函数就相 ...

  4. FFPLAY的原理(五)

    创建线程 Spawning Threads Overview Last time we added audio support by taking advantage of SDL's audio f ...

  5. SystemJS to Webpack – Before You Begin

    http://angularfirst.com/systemjs-to-webpack-before-you-begin/ This is a primer discussing why to mov ...

  6. java文件传输之文件编码和File类的使用

    ---恢复内容开始--- 我们知道,在用户端和服务端之间存在一个数据传输的问题,例如下载个电影.上传个照片.发一条讯息.在这里我们 就说一下文件的传输. 1.文件编码 相信大家小时候玩过积木(没玩过也 ...

  7. MapReduce的架构及原理

    MapReduce是一种分布式计算模型,是Hadoop的主要组成之一,承担大批量数据的计算功能.MapReduce分为两个阶段:Map和Reduce. 一.MapReduce的架构演变 客户端向Job ...

  8. 20岁少年小伙利用Python_SVM预测股票趋势月入十万!

      在做数据预处理的时候,超额收益率是股票行业里的一个专有名词,指大于无风险投资的收益率,在我国无风险投资收益率即是银行定期存款. pycharm + anaconda3.6开发,涉及到的第三方库有p ...

  9. 使用float属性的一些小技巧

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPwAAACJCAIAAACHJsJCAAAKUUlEQVR4nO2dTY8cxRnHd73LLsusDd ...

  10. sqlilabs 5

    第一个1不断返回true,2可以进行更改?id=-1' union select 1,2,3 and '1?id=-1' union select 1,2,3 and 1='1 ?id=-1' uni ...