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.> ...
随机推荐
- ARC中用代码检测一个对象有没有释放掉
ARC中用代码检测一个对象有没有释放掉 你试过在ARC中用代码检测对象有没有释放掉这种事情呢?即使你想过肯定也不知道怎么去实现,因为,这里会用到一个你基本上没怎么接触过的类:NSHashTable. ...
- vue-cli中自定义路径别名 assets和static文件夹的区别
转自:vue-cli中自定义路径别名 assets和static文件夹的区别 静态资源处理: assets和static文件夹的区别 相信有很多人知道vue-cli有两个放置静态资源的地方,分别是sr ...
- Jenkins安装 CentOS 7上安装Jenkins
CentOS 7上安装Jenkins Jenkins 安装 只安装不介绍 步骤1:更新CentOS 7 Linux系统管理员的最佳做法之一是使系统保持最新.安装最新的稳定包,然后重新启动. 1 2 ...
- February 15 2017 Week 7 Wednesday
Youth is not a time of life, it is a state of mind. 青春不是一段年华,而是一种心境. Likewise, maturity is not a tim ...
- oracle 日期常用函數sysdate
SYSDATE 2 --◎ 可得到目前系統的時間 3 4 ex. 5 select sysdate from dual; 6 ...
- js获取昨天今天和明天
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/UP19910522/article/details/30028299 <html> &l ...
- Spring自定义注解(验证身份证+性别+地区)
第一步:定义注解 PersonFormId: package com.wbg.maven1128.demo_formatter; import java.lang.annotation.*; @Doc ...
- 【题解】洛谷P1514 [NOIP2010TG] 引水入城(DFS+DP)
次元传送门:洛谷P1514 思路 可以证明如果有解 那么每个蓄水池可以覆盖到的干旱区必定是线段 证明: 举个栗子 8 9 8 7 9 7 6 9 6 明显到不了中间的点 如果不是连续的线段 中间肯定有 ...
- 安全过滤javascript,html,防止跨脚本攻击
本文改自: http://blog.51yip.com/php/1031.html 用户输入的东西是不可信认的,例如,用户注册,用户评论等,这样的数据,你不光要做好防sql的注入,还要防止JS的注入, ...
- 使用java原生API模拟请求下载文件
/** * * @param urlPath * 下载路径 * @param saveDir * 下载存放目录 * @return 返回下载文件 * @throws Exception */ publ ...