?? mktime.c
字號:
/** linux/kernel/mktime.c** (C) 1991 Linus Torvalds*/#include <time.h> // 時間頭文件,定義了標準時間數據結構tm 和一些處理時間函數原型。/** 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. *//* * 這不是庫函數,它僅供內核使用。因此我們不關心小于1970 年的年份等,但假定一切均很正常。 * 同樣,時間區域TZ 問題也先忽略。我們只是盡可能簡單地處理問題。最好能找到一些公開的庫函數 * (盡管我認為minix 的時間函數是公開的)。 * 另外,我恨那個設置1970 年開始的人 - 難道他們就不能選擇從一個閏年開始?我恨格里高利歷、 * 羅馬教皇、主教,我什么都不在乎。我是個脾氣暴躁的人。 */#define MINUTE 60 // 1 分鐘的秒數。#define HOUR (60*MINUTE) // 1 小時的秒數。#define DAY (24*HOUR) // 1 天的秒數。#define YEAR (365*DAY) // 1 年的秒數。/* 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)};// 該函數計算從1970 年1 月1 日0 時起到開機當日經過的秒數,作為開機時間。longkernel_mktime (struct tm *tm){ long res; int year; year = tm->tm_year - 70; // 從70 年到現在經過的年數(2 位表示方式), // 因此會有2000 年問題。 /* magic offsets (y+1) needed to get leapyears right. */ /* 為了獲得正確的閏年數,這里需要這樣一個魔幻偏值(y+1) */ res = YEAR * year + DAY * ((year + 1) / 4); // 這些年經過的秒數時間 + 每個閏年時多1 天 res += month[tm->tm_mon]; // 的秒數時間,在加上當年到當月時的秒數。 /* and (y+2) here. If it wasn't a leap-year, we have to adjust */ /* 以及(y+2)。如果(y+2)不是閏年,那么我們就必須進行調整(減去一天的秒數時間)。 */ if (tm->tm_mon > 1 && ((year + 2) % 4)) res -= DAY; res += DAY * (tm->tm_mday - 1); // 再加上本月過去的天數的秒數時間。 res += HOUR * tm->tm_hour; // 再加上當天過去的小時數的秒數時間。 res += MINUTE * tm->tm_min; // 再加上1 小時內過去的分鐘數的秒數時間。 res += tm->tm_sec; // 再加上1 分鐘內已過的秒數。 return res; // 即等于從1970 年以來經過的秒數時間。}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -