这几日发现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的重新编写的更多相关文章

  1. 日期时间篇asctime ctime gettimeofday gmtime localtime mktime settimeofday time

    asctime(将时间和日期以字符串格式表示) 相关函数 time,ctime,gmtime,localtime 表头文件 #include<time.h> 定义函数 char * asc ...

  2. Python基础篇(八)

    key words:私有变量,类静态变量,生成器,导入Python模块,r查看模块可以使用的函数,查看帮助信息,启动外部程序,集合,堆,时间模块,random模块,shelve模块,文件读取等 > ...

  3. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第10章 | 充电时刻

    第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简 ...

  4. 【转】Python——编码规范

    来自于 啄木鸟社区 Python Coding Rule --- hoxide 初译 dreamingk 校对发布 040724 --- xyb 重新排版 040915 --- ZoomQuiet M ...

  5. python-day15(正式学习)

    目录 递归 函数自我嵌套 调用 直接调用 间接调用 为什么要用递归呢 如何使用递归 内置函数 掌握 了解 面向对象方法 面向过程编程 注册 分层实现功能 递归 递归的本质就是函数调用自身,当然也会有一 ...

  6. python基础篇(完整版)

    目录 计算机基础之编程和计算机组成 什么是编程语言 什么是编程 为什么要编程 编程语言的分类 机器语言(低级语言) 汇编语言 高级语言 计算机的五大组成 CPU(相当于人类的大脑) 多核CPU(多个大 ...

  7. re模块,正则表达式起别名和分组机制,collections模块,time与datetime模块,random模块

    re模块和正则表达式别名和分组机制 命名分组 (1)分组--可以让我们从文本内容中提取指定模式的部分内容,用()来表示要提取的分组,需要注意的是分组 是在整个文本符合指定的正则表达式前提下进行的进一步 ...

  8. 【linux草鞋应用编程系列】_6_ 重定向和VT100编程

    一.文件重定向     我们知道在linux shell 编程的时候,可以使用文件重定向功能,如下所示: [root@localhost pipe]# echo "hello world&q ...

  9. python模块之time和datetime

    33.python模块之time      1.>>> time.time() 1470900847.8458395 ==>时间戳,从1970年到现在.      2.> ...

随机推荐

  1. easyui学习笔记12—tab标签页的添加和删除

    这一篇我们来看看标签页的添加和删除动作.我在想看这些例子还不如看文档,文档的内容更加全面,但是文档全部是理论没有实际的操作,看起来很枯燥,文档只能是遇到问题的时候查.easyui的文档写的还是很详细的 ...

  2. 模糊搜索框(H5),兼容安卓和ios(令人头大的ios输入法)

    项目里要可以实现,按照模糊,于是从jq22网站找到一个代码,效果如图: 具体的html代码:(复制,需要引入jq相关的支持文件) <!DOCTYPE html PUBLIC "-//W ...

  3. how to design Programs 学习笔记

    how to design Programs 学习笔记 */--> how to design Programs 学习笔记 目录 1. 前言 1.1. 系统化程序设计 1.2. 输入和输出 2. ...

  4. Windows下我喜爱的那些体积小但功能强大的软件

    我还是开门见山的说吧,接下来我给你大家介绍一些Windows上一些小软件,涉及到图片编辑,浏览器下载,文件搜索,音乐下载,文本编辑,视频录制等方面! 一:WinZIP中国 平常我们难免会遇到各种解压压 ...

  5. 20、Springboot 与数据访问(JDBC/自动配置)

    简介: 对于数据访问层,无论是SQL还是NOSQL,Spring Boot默认采用整合 Spring Data的方式进行统一处理,添加大量自动配置,屏蔽了很多设置.引入 各种xxxTemplate,x ...

  6. 4springboot:日志(下)

    1.指定配置  位置: 给类路径下放上每个日志框架自己的配置文件即可: SpringBoot就不使用他默认配置的了 使用什么日志则配置什么文件以及注意文件名 自定义: <?xml version ...

  7. MyBatis(9)整合spring

    具体的感兴趣可以参考:MyBatis 此时此刻,没用的话不再多说了,直接开始代码工程吧! 整体的代码实现: 具体使用到的我们在进行细说 基本上理解一边就能会使用整合  准备工作:  db.proper ...

  8. Crontab 学习

    分钟 小时 日期 月份 星期几 整点执行 0 8-22 * * * /usr/bin/php /home/anbaojia/wwwroot/shjn/yii report/sync 查看 cron 执 ...

  9. 从零开始学习CocoaPods安装和使用

    从零开始学习CocoaPods安装和使用   转载: Code4App原创:http://code4app.com/article/cocoapods-install-usage http://m.i ...

  10. c# 关闭socket的标准方法

    aSocket.Shutdown(SocketShutdown.Both); aSocket.Close(); c#关闭socket时,单独使用socket.close()通常会造成资源提前被释放,应 ...