这几日发现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. 使用NSURLConnection实现大文件断点下载

    使用NSURLConnection实现大文件断点下载 由于是实现大文件的断点下载,不是下载一般图片什么的.在设计这个类的时候本身就不会考虑把下载的文件缓存到内存中,而是直接写到文件系统. 要实现断点下 ...

  2. Linux--sudo权限讲解

    sudo简介:sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等.这样不仅减少了root用户的登录 和管理时间,同 ...

  3. less 学习

    收藏地址 : http://www.bootcss.com/p/lesscss/

  4. 一些通过SAP ABAP代码审查得出的ABAP编程最佳实践

    1. 这两个IF ELSE分支里检测的条件其实逻辑上来说都是同一类,应该合并到一个IF分支里进行检查: It is an expensive operation to open a file in a ...

  5. 应用服务&领域服务

    应用服务&领域服务 DDD理论学习系列——案例及目录 1. 引言 单从字面理解,不管是领域服务还是应用服务,都是服务.而什么是服务?从SOA到微服务,它们所描述的服务都是一个宽泛的概念,我们可 ...

  6. 迷宫问题——BFS

    改进版 BFS #include <bits/stdc++.h> using namespace std; #define coordi(x,y) ( m*(x-1)+y ) const ...

  7. 用poi-3.6-20091214.jar 实现java给excel资料加密

    用poi-3.6-20091214.jar 实现java给excel文件加密我用了网上的很多方法,但是都没有成功! HSSFWorkbook wb = new HSSFWorkbook(new Fil ...

  8. java中的泛型1

    1.泛型概述 泛型,即“参数化类型”.一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数 ...

  9. dba_tables、all_tables、user_tables

    本文摘抄自:http://blog.csdn.net/daxiang12092205/article/details/42921063 dba_tables : 系统里所有的表的信息,需要DBA权限才 ...

  10. C/C++心得-面向对象

    首先本文以C++描述面向对象.面向对象应该可以说是C++对C最为重要的扩充.面向对象使得C++可以用更符合人的思维模式的方式编程,使得有一定基础的程序员可以更容易的写程序.相对于C,C++还有其他许多 ...