【Unity游戏开发】Lua中的os.date和os.time函数
一、简介
最近马三在工作中经常使用到了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函数的更多相关文章
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)
本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中 ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)
本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二) 前几天有点事情所以没有继续更新,今天我们接着说.上个帖子中我们看到已经把Excel数据生成了.bin的文件,不过其 ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (四)2018.4.3更新
本帖是延续的:C# Unity游戏开发--Excel中的数据是如何到游戏中的 (三) 最近项目不算太忙,终于有时间更新博客了.关于数据处理这个主题前面的(一)(二)(三)基本上算是一个完整的静态数据处 ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一)
引言 现在做游戏开发的没有几个不用Excel的,用的最多的就是策划.尤其是数值策划,Excel为用户提供强大的工具,各种快捷键,各种插件,各种函数.但是作为程序来说其实关注的不是Excel而是它最终形 ...
- 【Unity游戏开发】记一次解决 LuaFunction has been disposed 的bug的过程
一.引子 RT,本篇博客记录的是马三的一次解决 LuaFunction has been disposed 的bug的全过程,事情还要从马三的自研框架 ColaFrameWork 说起.最近,马三在业 ...
- 【Unity游戏开发】浅谈Lua和C#中的闭包
一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...
- 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher
一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...
- 喵的Unity游戏开发之路 - 推球:游戏中的物理
很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...
- 关于Unity游戏开发方向找工作方面的一些个人看法
这是个老生常谈,却又是谁绕不过去的话题,而对于每个人来说,所遇到的情况又不尽相同,别人的求职方式和路线不一定适合你,即使是背景很相似的两个人,有时候机遇也很重要. 我本人的工作经验只有一年,就业方式 ...
随机推荐
- 中文字体名称对照表(unicode码)及20个web安全字体
在Web编码中,CSS默认应用的Web字体是有限的,虽然在新版本的CSS3,我们可以通过新增的@font-face属性来引入特殊的浏览器加载字体.但多数情况下,考虑各个因素的影响我们还是在尽量充分利用 ...
- 兼容 Android 4.4 透明状态栏与导航栏
http://www.apkbus.com/Android-163388-1-1.html?_dsign=73d41229 android 系统自4.2 开始 UI 上就没多大改变,4.4 也只是增加 ...
- C语言编对双精度数保留一位小数
/*第一题*/ #include<stdio.h> //输入1.2345 输出1.2000 //输入1.2547 输出1.3000 main(){ ; printf("请输入:\ ...
- JAVAEE——BOS物流项目13:Quartz概述、创建定时任务、使用JavaMail发送邮件、HighCharts概述、实现区域分区分布图
1 学习计划 1.Quartz概述 n Quartz介绍和下载 n 入门案例 n Quartz执行流程 n cron表达式 2.在BOS项目中使用Quartz创建定时任务 3.在BOS项目中使用Jav ...
- spring的简单入门
spring是一个轻量级的JavaEE解决方案,是众多优秀设计模式的整合.spring的核心是:(工厂)容器 1.设计模式:解决一些特定问题的经典代码.共有23中设计模式(工厂,单例,代理,适配,装饰 ...
- Java虚拟机-类文件
代码编译的结果从本地机器码转换为字节码,是存储格式发展的一小步,却是编程语言发展的一大步.计算机只认识0和1,所以我们的程序需要经过编译器翻译成由0和1组成的二进制格式才能由计算机执行.经过技术的发展 ...
- asp.net路径问题
-------------初级篇---------------------------------------- 在一般的href中路径的引用问题 ./index.aspx与index.aspx都 ...
- 使用xshell链接虚拟机的方法
给大家介绍一下虚拟机和Xshell5连接的基本配置1.安装虚拟机,跟着提示一步一步安装即可,注意添加镜像文件,虚拟机就完成了.2.下载一个Xshell5,安装好之后.要修改虚拟机的网卡状态 1) ...
- JavaScript的数组知识案例之随机点名器
本次分享JavaScript主要知识点涉及到for循环.if选择结构判断语句.数组的定义.定时器.清除定时器.日期对象的使用. 执行后效果图: 思路: 1.网页结构搭建: HTML 2.网页布局美化: ...
- Python《学习手册:第二章-习题》
什么是Python解释器? Python解释器是运行Python程序的程序. 什么是源代码? 源代码是为程序所写的语句:它包括文本文件(通常以.py为文件名结尾)的文件. 什么是字节码? 字节码是Py ...