gmtime与mktime的重新编写
这几日发现Linux的mktime与gmtime所处理的数据类型是32位的,即代表时间设置只能设置到2038年,在公司的产品要实现这个时间的突破还是得自己写一个新的处理时间的函数。
作为一个刚毕业的程序员,老板把这个任务交给我了,虽然到最后老板没有采纳我的算法,但是还是po上我的算法,作为我的第一篇文章吧。欢迎各位大神来指错我的错误,谢谢。
部分代码是从网上一位前辈那借鉴而来的,网址找不到了。
typedef unsigned long long time_t2; const unsigned short int mon_yday[][] =
{
//正常年限:
{ , , , , , , , , , , , , },
//闰年:
{ , , , , , , , , , , , , }
}; //判断一个年份是否为闰年,是就返回1,不是就返回0
static int isLeapYear(int year)
{
return((year % == && year % != ) || (year % == ));
} //获取一年的天数
static int getDaysForYear(int year)
{
return (isLeapYear(year) ? : );
} #define START_YEAR (1970ULL)
#define SECOND_DAY (86400ULL) //60*60*24
#define SECOND_HOUR (3600ULL) //60*60
#define SECOND_MIN (60) //
#define SECOND_YEAR (365*24*3600ULL)
time_t2 mktime2(struct tm *timeVal)
{
time_t2 retVal = ; retVal += (timeVal->tm_year - )* getDaysForYear((timeVal->tm_year) + ) * SECOND_DAY; // 年份
retVal += mon_yday[isLeapYear((timeVal->tm_year) + )][timeVal->tm_mon] * SECOND_DAY; //月份
retVal += (timeVal->tm_mday + ((timeVal->tm_year - ) / - (timeVal->tm_year - ) / + (timeVal->tm_year - ) / ) - ) * SECOND_DAY; //天
retVal += timeVal->tm_hour * SECOND_HOUR; //小时
retVal += timeVal->tm_min * SECOND_MIN; //分钟
retVal += timeVal->tm_sec; //秒 return retVal;
}
//根据秒数计算日期
static void getDate(time_t2 second, int *year, int * month, int* day, int *yday)
{
int days = second / SECOND_DAY;
time_t2 tempSecond;
int curYear = START_YEAR, addYears = ;
int leftDays = days;
int i = ; //计算年份
int daysCurYear = getDaysForYear(curYear);
while (leftDays >= daysCurYear)
{
leftDays -= daysCurYear;
curYear++;
addYears++;
daysCurYear = getDaysForYear(curYear);
}
*year = addYears + ; //计算月与日
tempSecond = second - addYears *SECOND_YEAR - ((addYears / - addYears / + addYears / ) - )*SECOND_DAY;
days = tempSecond / SECOND_DAY; //除去年份后剩下的天数
*yday = days - ;
int IsLeapYear = isLeapYear(*year + );
for (i; i < ; i++)
{
if (days <= mon_yday[IsLeapYear][i])
{
*month = i - ; // mon是[0,11],所以-1
*day = days - mon_yday[IsLeapYear][i - ];
break;
}
} }
//计算时间
static void getTime(time_t2 seconds, int* hour, int* minute, int* second)
{
time_t2 leftSeconds = seconds % SECOND_DAY;
*hour = leftSeconds / SECOND_HOUR;
*minute = (leftSeconds % SECOND_HOUR) / SECOND_MIN;
*second = leftSeconds % SECOND_MIN;
}
struct tm * gmtime2(time_t2 *secVal)
{
static struct tm TimeVal;
getDate(*secVal, &TimeVal.tm_year, &TimeVal.tm_mon, &TimeVal.tm_mday, &TimeVal.tm_yday);
getTime(*secVal, &TimeVal.tm_hour, &TimeVal.tm_min, &TimeVal.tm_sec);
TimeVal.tm_wday = GetWeekIndex(TimeVal.tm_year + , TimeVal.tm_mon + , TimeVal.tm_mday);
return &TimeVal;
}
gmtime与mktime的重新编写的更多相关文章
- 日期时间篇asctime ctime gettimeofday gmtime localtime mktime settimeofday time
asctime(将时间和日期以字符串格式表示) 相关函数 time,ctime,gmtime,localtime 表头文件 #include<time.h> 定义函数 char * asc ...
- Python基础篇(八)
key words:私有变量,类静态变量,生成器,导入Python模块,r查看模块可以使用的函数,查看帮助信息,启动外部程序,集合,堆,时间模块,random模块,shelve模块,文件读取等 > ...
- <<Python基础教程>>学习笔记 | 第10章 | 充电时刻
第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简 ...
- 【转】Python——编码规范
来自于 啄木鸟社区 Python Coding Rule --- hoxide 初译 dreamingk 校对发布 040724 --- xyb 重新排版 040915 --- ZoomQuiet M ...
- python-day15(正式学习)
目录 递归 函数自我嵌套 调用 直接调用 间接调用 为什么要用递归呢 如何使用递归 内置函数 掌握 了解 面向对象方法 面向过程编程 注册 分层实现功能 递归 递归的本质就是函数调用自身,当然也会有一 ...
- python基础篇(完整版)
目录 计算机基础之编程和计算机组成 什么是编程语言 什么是编程 为什么要编程 编程语言的分类 机器语言(低级语言) 汇编语言 高级语言 计算机的五大组成 CPU(相当于人类的大脑) 多核CPU(多个大 ...
- re模块,正则表达式起别名和分组机制,collections模块,time与datetime模块,random模块
re模块和正则表达式别名和分组机制 命名分组 (1)分组--可以让我们从文本内容中提取指定模式的部分内容,用()来表示要提取的分组,需要注意的是分组 是在整个文本符合指定的正则表达式前提下进行的进一步 ...
- 【linux草鞋应用编程系列】_6_ 重定向和VT100编程
一.文件重定向 我们知道在linux shell 编程的时候,可以使用文件重定向功能,如下所示: [root@localhost pipe]# echo "hello world&q ...
- python模块之time和datetime
33.python模块之time 1.>>> time.time() 1470900847.8458395 ==>时间戳,从1970年到现在. 2.> ...
随机推荐
- lua学习笔记之userdata
这一段时间看了<programming in lua>中的第28章,看一遍并不是很难,但是只是朦胧的感觉,雾里看花,水中望月.最终还是决定敲出来自己看看,练练手,结果受益不少,也遇到了一些 ...
- June 18th 2017 Week 25th Sunday
Life was like a box of chocolates, you never know what you're gonna get. 人生就像一盒巧克力,结果往往出人意料. Compare ...
- (一)自定义ViewGroup绘制出菜单
从网上学习了hyman大神的卫星菜单实现,自己特意亲自又写了一编代码,对自定义ViewGroup的理解又深入了一点.我坚信只有自己写出来的知识才会有更加好的的掌握.因此也在自己的博客中将这个卫星菜单的 ...
- WC2018 滚粗记
虽然又考炸了但还是总结一下.. $day0$:没有什么很重要的事.. $day1$:除了听(dong)课(mian)以外没有什么很重要的事.. $day2$:除了听(dong)课(mian)以外没有什 ...
- Ubuntu下Apache配置网站根路径
安装之后apache默认的跟路径是/var/www/ 如何修改这个默认路径呢? 直接编辑/etc/apache2/sites-available/default-ssl.conf,将Docum ...
- Linux修改权限命令chmod用法详解
Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限分为只读,只写和可执行三种.以文件为例,只读权限表示只允许读其内容,而禁 ...
- Android HttpClient自己主动登陆discuz论坛!
你登陆论坛的时候,我们先看看浏览器干了什么事儿: 用Firefox打开HiPda 的登陆页面,输入用户名和password,点登陆. 以下是通过firebug插件获取的数据: 能够看到浏览器这个htt ...
- Motrix 全平台多功能下载工具[Windows、macOS、Linux]
Motrix的界面很朴素,使用起来其实也很方便.点击左侧的「+」图标就可以添加下载任务,跟其他的下载工具没什么区别.暂停.恢复.查看.复制,这些功能都不缺.界面也挺好看的,下载速度还会提示在图标的角标 ...
- PHP数组 转 对象/对象 转 数组
/** * 数组 转 对象 * * @param array $arr 数组 * @return object */ function array_to_object($arr) { if (gett ...
- 再谈Spring Boot中的乱码和编码问题
编码算不上一个大问题,即使你什么都不管,也有很大的可能你不会遇到任何问题,因为大部分框架都有默认的编码配置,有很多是UTF-8,那么遇到中文乱码的机会很低,所以很多人也忽视了. Spring系列产品大 ...