Unix時間戳 怎麼計算

Unix時間戳(Unix timestamp),或稱Unix時間(Unix time)POSIX時間(POSIX time),是一種時間表示方式,定義爲從格林威治時間1970年01月01日00時00分00秒起至現在的總秒數。Unix時間戳不僅被使用在Unix 系統、類Unix系統中,也在許多其他操作系統中被廣告採用。
 
【注意】目前相當一部分操作系統使用32位二進制數字表示時間。此類系統的Unix時間戳最多可以使用到格林威治時間2038年01月19日03時14分07秒(二進制:01111111 11111111 11111111 11111111)。其後一秒,二進制數字會變爲10000000 00000000 00000000 00000000,發生溢出錯誤,造成系統將時間誤解爲1901年12月13日20時45分52秒。這很可能會引起軟件故障,甚至是系統癱瘓。使用64位二進制數字表示時間的系統(最多可以使用到格林威治時間292,277,026,596年12月04日15時30分08秒)則基本不會遇到這類溢出問題。
 
目前經常出現的時間有三個:
本地時間(locale time)
格林威治時間(Greenwich Mean Time GMT
時間協調時間 (Universal Time Coordinated UTC
 
時間標準:
(1)世界時 
世界時是最早的時間標準。在1884年,國際上將1s確定爲全年內每日平均長度的1/8.64×104。以此標準形成的時間系統,稱爲世界時(UT1)。 1972年國際上開始使用國際原子時標,從那以後,經過格林威治老天文臺本初子午線的時間便被稱爲世界時(UT2),或稱格林威治時間GMT),UT2是對地球轉速週期性差異進行校正後的世界時。 
(2)原子時 
1967年,人們利用銫原子振盪週期極爲規律的特性,研製出了高精度的原子時鐘,將銫原子能級躍遷輻射9192631770周所經歷的時間定爲1s。現在用的時間就是1971年10月定義的國際原子時,是通過世界上大約200多臺原子 鍾進行對比後,再由國際度量衡局時間所進行數據處理,得出的統一的原子時,簡稱TAI。 
(3)世界協調時 
世界協調時是以地球自轉爲基礎的時間標準。由於地球自轉速度並不均勻,並非每天都是精確的86400原子s,因而導致了自轉時間與世界時之間存在18個月有1s的誤差。爲糾正這種誤差,國際地球自轉研究所根據地球自轉的實際情況對格林威治時間進行增減閏s的調整,與國際度量衡局時間所聯合向全世界發佈標準時間,這就是所謂的世界協調時(UTC:CoordinatdeUniversalTime)。UTC的表示方式爲:年(y)、月(m)、日(d)、時(h)、分(min)、秒(s),均用數字表示。
 
GPS 系統中有兩種時間區分,一爲UTC,另一爲LT(地方時)兩者的區別爲時區不同,UTC就是0時區的時間,地方時爲本地時間,如北京爲早上八點(東八區),UTC時間就爲零點,時間比北京時晚八小時,以此計算即可
  通過上面的瞭解,我們可以認爲格林威治時間就是時間協調時間(GMT=UTC),格林威治時間和UTC時間均用秒數來計算的。
 
   而在我們平時工作當中看到的計算機日誌裏面寫的時間大多數是用UTC時間來計算的,那麼我們該怎麼將UTC時間轉化爲本地時間便於查看日誌,那麼在作程序開發時又該怎麼將本地時間轉化爲UTC時間呢?
   下面就介紹一個簡單而使用的工具,就是使用linux/unix命令date來進行本地時間和local時間的轉化。
   大家都知道,在計算機中看到的utc時間都是從(1970年01月01日 0:00:00)開始計算秒數的。所看到的UTC時間那就是從1970年這個時間點起到具體時間共有多少秒。
我們在編程中可能會經常用到時間,比如取得系統的時間(獲取系統的年、月、日、時、分、秒,星期等),或者是隔一段時間去做某事,那麼我們就用到一些時間函數。
 
linux下存儲時間常見的有兩種存儲方式,(1)從1970年到現在經過了多少秒(2)用一個結構來分別存儲年月日時分秒的
(1)time_t 這種類型就是用來存儲從1970年到現在經過了多少秒
struct timeval //精確到微妙
{
    long tv_sec; /*秒*/
    long tv_usec; /*微秒*/
};
struct timespec //精確到納秒
{
time_t tv_sec; //秒
long tv_nsec; //納秒
}
1s = 1000ms(毫秒) = 1000*1000us(微妙) = 1000*1000*1000ns(納秒)
 
(2)直接存儲年月日的是一個結構:
struct tm
{
    int tm_sec;  /*秒,正常範圍0-59, 但允許至61*/
    int tm_min;  /*分鐘,0-59*/
    int tm_hour; /*小時, 0-23*/
    int tm_mday; /*日,即一個月中的第幾天,1-31*/
    int tm_mon;  /*月, 從一月算起,0-11*/  1+p->tm_mon;
    int tm_year;  /*年, 從1900至今已經多少年*/  1900+ p->tm_year;
    int tm_wday; /*星期,一週中的第幾天, 從星期日算起,0-6*/
    int tm_yday; /*從今年1月1日到目前的天數,範圍0-365*/
    int tm_isdst; /*日光節約時間的旗標*/
};
【注意】需要特別注意的是,年份是從1900年起至今多少年,而不是直接存儲如2011年;月份從0開始的,0表示一月;星期也是從0開始的,0表示星期日,1表示星期一。
 
下面介紹一下我們常用的時間函數:
#include <time.h>
(1)將結構中的信息轉換爲真實世界的時間,以字符串的形式顯示
char *asctime(const struct tm* timeptr);
 
(2)將timep轉換爲真是世界的時間,以字符串顯示,它和asctime不同就在於傳入的參數形式不一樣
char *ctime(const time_t *timep);
 
(3)返回兩個時間相差的秒數
double difftime(time_t time1, time_t time2);
 
(4)返回當前距離1970年的秒數和微妙數,後面的tz是時區,一般不用
int gettimeofday(struct timeval *tv, struct timezone *tz);
 
(5)將time_t表示的時間轉換爲沒有經過時區轉換的UTC時間,是一個struct tm結構指針
struct tm* gmtime(const time_t *timep);
 
(6)和gmtime類似,但是它是經過時區轉換的時間。
stuct tm* localtime(const time_t *timep);
 
(7)將struct tm 結構的時間轉換爲從1970年至今的秒數
time_t mktime(struct tm* timeptr);
 
(8)取得從1970年1月1日至今的秒數
time_t time(time_t *t);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章