《linux 内核完全剖析》 mktime.c

tm结构体的定义在time.h里面

struct tm {
    int tm_sec;
    int tm_min;
    int tm_hour;
    int tm_mday;
    int tm_mon;
    int tm_year;
    int tm_wday;
    int tm_yday;
    int tm_isdst;

};



/*
 *  linux/kernel/mktime.c
 *
 *  (C) 1991  Linus Torvalds
 */

#include <time.h>

/*
 * This isn‘t the library routine, it is only used in the kernel.
 * as such, we don‘t care about years<1970 etc, but assume everything
 * is ok. Similarly, TZ etc is happily ignored. We just do everything
 * as easily as possible. Let‘s find something public for the library
 * routines (although I think minix times is public).
 */
/*
 * PS. I hate whoever though up the year 1970 - couldn‘t they have gotten
 * a leap-year instead? I also hate Gregorius, pope or no. I‘m grumpy.
 */
#define MINUTE 60         //一分钟60秒,这里60是以秒为单位计数
#define HOUR (60*MINUTE)  //一小时60分钟
#define DAY (24*HOUR)     //一天24小时
#define YEAR (365*DAY)    //一年365天

/* interestingly, we assume leap-years */
static int month[12] = {//初始化每个月开始的秒数,即以秒为单位的起始时间
    0,
    DAY*(31),
    DAY*(31+29),
    DAY*(31+29+31),
    DAY*(31+29+31+30),
    DAY*(31+29+31+30+31),
    DAY*(31+29+31+30+31+30),
    DAY*(31+29+31+30+31+30+31),
    DAY*(31+29+31+30+31+30+31+31),
    DAY*(31+29+31+30+31+30+31+31+30),
    DAY*(31+29+31+30+31+30+31+31+30+31),
    DAY*(31+29+31+30+31+30+31+31+30+31+30)
};

long kernel_mktime(struct tm * tm)
{
    long res;
    int year;

    year = tm->tm_year - 70;//从1970年开始计时,year得到的是和70年的年差
/* magic offsets (y+1) needed to get leapyears right.*/
    res = YEAR*year + DAY*((year+1)/4);//闰年多一天
    res += month[tm->tm_mon];//时间精确到月
/* and (y+2) here. If it wasn‘t a leap-year, we have to adjust */
    if (tm->tm_mon>1 && ((year+2)%4))
    //因为是从1970年算起的,这里year+2就能耦合上闰年。。。换而言之,1972年是闰年,但是年差是2,这里补上2就对齐了。。。。
        res -= DAY;//year不是闰年,则减一天
    res += DAY*(tm->tm_mday-1);
    res += HOUR*tm->tm_hour;
    res += MINUTE*tm->tm_min;
    res += tm->tm_sec;//时间精确到秒
    return res;
}








bubuko.com,布布扣






《linux 内核完全剖析》 mktime.c,布布扣,bubuko.com

《linux 内核完全剖析》 mktime.c


推荐文章
在Eclipse或者STS中使用SVN插件

在Eclipse/STS安装SVN插件  在STS4中默认是没有SVN插件的,需要我们手动安装SVN插件安装有两种方式,一种是在线安装,一种是离线安装但是在线安装,由于网络问题,一般很难安装成功,所以

Linux下设置环境变量

setenv(setenvironment variable)功能说明:查询或显示环境变量。语  法:setenv [变量名称][变量值]补充说明:setenv为tsch中查询或设置环境变量的指令。

(赵小明RHCE笔记)linux基础之一

默认情况下,linux有一个图形界面,五个文本虚拟终端[email protected]#tty 用来查看当前是在哪个tty下ctrl+alt+F1-F7用来切换不同终端startx命令用来启动图形化

ubuntu配置静态路由及重启生效

ubuntu配置静态路由及重启生效第一种方法:使用route命令(添加临时路由)添加到主机的路由#routeadd-host192.168.1.123deveth0#routeadd-host192.

《鸟哥linux》--第十一章课后习题答案

1.在linux上可以找到哪些shell?哪个档案记录可用的shell?儿linux预设的shell是?  1./bin/bash,/bin/tcsh,/bin/csh  2./etc/shells 

Linux学习笔记——硬盘分区和安装双系统

1.前言  假设电脑上已经安装了windowsXP或者windows7。试图在使用windows的同时,在电脑上安装ubuntu。  假设电脑上已经存在C盘、D盘、E盘和F盘,且E盘和F盘的剩余空间较

linux系统开启秘钥认证登录详解

本文以已经产生好私钥和公钥为前提去讲述后续的增加秘钥认证的步骤:(秘钥的生成工具为:ssh-keygen,命令执行完后会在当前用户的家目录中生成了一个.ssh的隐藏目录,内含两个密钥文件。id_rsa

Ubuntu编译配置Opencv

一、1.下载opencv源代码2.安装编译依赖库 2.1 sudoapt-getupdate 2.2 sudoapt-getinstallcmakesudoapt-getinstalllibgtk2.

Hibernate的increment主键生成机制带来的问题

      最近给学校做的系统,总出现主键插入冲突的问题。主键是通过hibernate自动生成的,设置increment属性,总出现Duplicate entry的错误。搜到解决方案如下:     

linux基础命令学习(一)

pwd输出当前工作路径tree以树状图列出目录的内容ctrl+c取消命令的执行clear 清空屏幕ls列出文件目录蓝色是目录,白色是普通文件aliascls=clear 别名终端:本地终端、远程虚

linux find命令

由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统(NFS ),find命令在该文件系统中同样有效,只你具有相应的权限。 在运

Linux环境下安装yum

 若出现以下错误则代表需要重新安装yum: ThissystemisnotregisteredtoRedHatSubscriptionManagement.Youcanusesubscription

【Linux学习】Ubuntu下内核编译(一)

(1)当要执行内核配置时,输入makemenuconfig时出现错误 遇到这个问题,主要是以为没有ncurses库,而makemenconfig需要这个库,因此需要安装ncurses或者ncurse

《SLAM机器人基础教程》第五章 Linux基础

第五章Linux基础本章基于树莓派,以ubuntu为例讲解Linux。本章内容规划:5.1节,Linux概述5.2节,系统安装5.3节,Linux指令及ubuntu的使用5.4节,SSH和VNC5.5

Mac进行一些操作时提醒Operation not permitted的完美解决

Mac版本10.14.5,向下向上都行:    1.关闭mac的安全机制,首先可以在正常模式下,输入csrutilstatus命令,查看mac安全机制是否开启。    2.如果Protectionst

在Linux下播放与录制电视

最近,在自己的Debian7.264位系统上成功安装了圆刚AverMediaC725B视频卡驱动。于是,可以使用mplayer与mencoder来看电视与录节目了。其中,用于播放电视的命令如下: 

会话缓存(Session Cache)?

最常用的一种使用Redis的情景是会话缓存(sessioncache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如

如何删除Mac 的启动台(应用)残留的图标

如何删除MacOs启动台(应用)残留的图标方法很简单,删除“启动台”数据库里对应app的信息即可忘记什么版本的时候以前在“应用程序”删除应用后,启动台自动更新删掉不知道什么时候开始,直接在“应用程序”

安装VMWare tools,踩坑。记录一下

对于没钱买服务器的小白,只能靠安装虚拟机来勉强度日子。最近比较闲,想实现一下docker的自动化部署,在制作java8镜像时出了个问题。就是怎么在虚拟机上实现与本机文件夹的共享。坑了2天。记录一下,环

【Linux】crontab 每隔1小时 2小时的执行job写法

crontab-l crontab-e   每五分钟执行 */5**** 每小时执行    0**** 每2小时执行    0*/2*** 每天执行       00*** 每周执行