巧用Unix时间戳-创新互联
Unix时间戳包含了丰富的时间信息,很多平台都有时间戳的概念,也提供了不少操作时间戳的系统调用
创新互联建站是一家专注于成都网站建设、做网站和成都西信服务器托管的网络公司,有着丰富的建站经验和案例。这些系统调用固然强大,但我比较喜欢使用便捷的方法,而不是去调用系统函数,下面分享敲代码时候碰到的两个小例子,我使用了非常规的做法,使效率提高了那么一点点。
当代码变简单,变高效,哪怕只是一点点,心情都是非常舒畅的~~~
定义:是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
Example1
需求,一个存储在Memcached(可理解为数据库)的结构体,结构主要内容如下,每个玩家每天可以获得MAX经验,exp字段表示今天得到的经验,这个字段用于判断是否达到当天的最高经验
假设玩家要增加100经验,exp+100超过MAX了,那么他要增加的经验为 MAX-exp,在这之前要做一个判断
先判断是否今天第一次获得经验,如果是,设置当前的时间到time,然后exp设置为100
这时候一般做法可能是,把time和当前时间提取出来,获取他们的年月日,来判断是否同一天,如果不是同一天,把当前时间设置为time
struct xx{
int exp; //经验
unsigned int time; //时间
};
我的做法是,获取当前时间和time,但这个time我不会把时间戳存进去,而是计算之后的一个数值
一天的时间为60*60*24=86400
#define DAYTIME 86400
当前时间/DAYTIME 和 time做判断,如果相等,表示同一天,如果不相等,把当前时间/DAYTIME 设置为time
两种做法相比较,第一种需要调用两次系统函数,来获取tm,还有一次time系统调用,然后做3次判断,年月日
第二种,只调用一次time系统调用,做一次除法和一次判断,搞定
Example2
需求,在Memcached存一个数据,需要设置超时时间,每日凌晨过期,这样的需求很广泛,每日任务之类的都可以有这种需求
那么在设置这个key的时候,需要指定超时时间~,指定距离今日凌晨剩余的秒数。PS(当秒数为0的时候,需要设置为86400,不然0在memcached中的意思是,永不超时)
常规做法,通过系统函数获取当日的时分秒,然后计算出当日逝去的秒数,最后86400-秒数,设置为超时时间
我的做法,
#define DAYTIME 86400
当前时间%DAYTIME 即可得到当日逝去的秒数,然后86400-当日逝去的秒数,设置为超时时间
两种做法相比较,第一种需要额外调用一次系统函数,两次乘法两次加法 时*3600+分*60+秒得到当日逝去秒数
第二种,只做了一个取模操作,就得到了上面若干步骤得到的结果
如果你有其他高效的做法,欢迎分享,互相学习
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网站名称:巧用Unix时间戳-创新互联
标题网址:http://myzitong.com/article/gsjdi.html