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.> ...
随机推荐
- Linux文件的I/O操作
C标准函数与系统函数的区别 标准函数printf调用应用层api,然后应用层api调用内核层api,再通过内核层api调用硬件设备 一个pirntf打印helloworld那么sys_writ ...
- easyui学习笔记6—基本的Accordion(手风琴)
手风琴也是web页面中常见的一个控件,常常用在网站后台管理中,这里我们看看easyui中基本的手风琴设置. 1.先看看引用的资源 <meta charset="UTF-8" ...
- Types of Computer Systems
Types of Computer Systems Para 1 You should be familiar with the differences among computer systems ...
- 利物浦VS热刺,我努力不去想,但利物浦真的在争冠
用这张图作为开头吧,早餐的时候打开网易,苏神破门红军4-0登榜首的新闻,习惯性的点进去看看KOP的评论,有一句回复『利物浦该夺冠了,多少年了.喜欢利物浦比喜欢老婆还早,老婆都成黄脸婆了.现在带着女 ...
- stl sort使用不当造成崩溃
#include <iostream>#include <vector>#include <algorithm>using namespace std; bool ...
- Java对象表示方式1:序列化、反序列化的作用
1.序列化是的作用和用途 序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存 ...
- windows8安装msi软件提示2503错误的解决办法
windows8以后的版本安装msi软件(比如nodejs.msi.Git.msi.python.msi.T ortoiseSVN.msi)的时候老师出现2503.2502的错误,究其原因还是系统权限 ...
- Redis配置文件(3)常见的配置修改
常见的配置: redis.conf 配置项说明如下: 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以 ...
- FactoryBean的实现原理与作用
FactoryBean与BeanFactory: 这俩货在拼写上很是相似,很多同学在看IOC源码或者其他地方并不能分清有啥区别,前面的IOC源码中我简单说过,现在统一简单来讲一下: FactoryBe ...
- 如何清理Macbook垃圾文件
如何清理Macbook垃圾文件,腾出更多硬盘空间 在Macbook使用久之后,会发现本来还富裕的硬盘,变得越来越少,尤其现在Macbook使用容量很小的固态硬盘.在此种情况下,该如何清理Macbook ...