《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;
}
《linux 内核全然剖析》 mktime.c的更多相关文章
- 《linux 内核全然剖析》 fork.c 代码分析笔记
		
fork.c 代码分析笔记 verifiy_area long last_pid=0; //全局变量,用来记录眼下最大的pid数值 void verify_area(void * addr,int s ...
 - 《linux 内核全然剖析》sched.c sched.h 代码分析笔记
		
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011368821/article/details/25129835 sched.c sched.h ...
 - 《linux 内核全然剖析》 chapter 2 微型计算机组成结构
		
微型计算机组成结构 系统的基本组成: 软件是一种控制硬件操作和动作的指令流. 2.1 微型计算机的组成原理 当中CPU通过地址线,数据线,和控制信号线组成的内部总线与系统其它部分进行数据通信.地址线用 ...
 - 《linux 内核全然剖析》 sys.c 代码分析
		
sys.c 代码分析 setregid /* * This is done BSD-style, with no consideration of the saved gid, except * th ...
 - 《linux 内核全然剖析》编译linux 0.12 内核  Ubuntu 64bits 环境
		
我×.. . 最终好了,大概3 4个小时吧...各种毛刺问题.终究还是闯过来了.. .. ubuntu2@ubuntu:~/Downloads/linux-0.00-050613/linux-0.00 ...
 - 《linux 内核全然剖析》  include/asm/io.h
		
include/asm/io.h #define outb(value,port) \ __asm__ ("outb %%al,%%dx"::"a" (valu ...
 - 《linux 内核全然剖析》 chapter 4  80x86 保护模式极其编程
		
80x86 保护模式极其编程 首先我不得不说.看这章真的非常纠结...看了半天.不知道这个东西能干嘛.我感觉唯一有点用的就是对于内存映射的理解...我假设不在底层给80x86写汇编的话.我 ...
 - 《linux 内核全然剖析》 笔记  CODE_SPACE 宏定义分析
		
在memory.c里面.遇到一个宏定义,例如以下: #define CODE_SPACE(addr) ((((addr)+4095)&~4095) < \ current->sta ...
 - 第三十二课   linux内核链表剖析
		
__builtin_prefetch是gcc扩展的,用来提高访问效率,需要硬件的支持. 在标准C语言中是不允许static inline联合使用的. 删除依赖的头文件,将相应的结构拷贝到LinuxLi ...
 
随机推荐
- BZOJ5306  [HAOI2018]染色  【组合数 + 容斥 + NTT】
			
题目 为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度为 \(N\) 的序列, 每个位置都可以被染成 \(M\) 种颜色中的某一种. 然而小 C 只 ...
 - Repeater嵌套(灵活的)
			
页面代码 <form id="form1" runat="server"> <asp:Repeater ID="rptCategor ...
 - 逆序对(inversion)
			
逆序对(inversion) 题目描述 对于序列AA,它的逆序对数定义为满足i<ji<j,且Ai>AjAi>Aj 的数对i,ji,j的个数. 现给你11到nn的一个排列,并按照 ...
 - codechef May Challenge 2016 FORESTGA: Forest Gathering  二分
			
Description All submissions for this problem are available. Read problems statements in Mandarin Chi ...
 - 0/1 knapsack problem
			
Problem statement Given n items with size Ai and value Vi, and a backpack with size m. What's the ma ...
 - 传送带(bzoj 1857)
			
Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度 ...
 - 高级参数绑定(数组和List绑定)
			
1.绑定数组: (1) 需求 在商品列表页面选中多个商品,然后删除. (2). 需求分析 功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Contr ...
 - 【DirectX SDK Extra】提示缺少Qedit.h问题 (转)
			
原文转自 http://blog.csdn.net/joeblackzqq/article/details/10944005 DirectX 9.0 SDK 开发包以及扩展包下载(February 2 ...
 - 修复无法启动的mariadb
			
一直在用的数据库,今天无论如何启动不了了,最后在archlinux wiki上查到了解决方法: mysql_install_db --user=mysql --basedir=/usr --datad ...
 - jdk、maven、tomcat环境变量配置
			
1.jdk 新建环境变量: JAVA_HOME:C:\Program Files\Java\jdk1.8.0_91 CLASSPATH:.;%JAVA_HOME%\lib;%JAVA_HOME%\li ...