1. 程式人生 > >《linux 下的時間獲取函式》

《linux 下的時間獲取函式》

一. linux時間漫談

        linux內部對時間是用從Epoch時間開始計時的秒數來表示的。Epoch也就是通用協調時間(UTC,也就是格林尼治平均時間或格林威治標準時間,CMT)。linux將這個資料儲存在time_t結構體變數裡,目前的32為系統最多支撐到2038年,64位系統就還早著呢。

        談到時間,不得不講一下時區的問題。以格林尼治所在地區為標準,向東向西各劃分出12個時區,每個時區之間經度相差15度,時間相差1小時。例如,北京在東八區,以東經120度(15*8)為中軸(範圍在112.5~127.5度),東八區的時間比格林尼治地區時間早8小時。也就是說,如果linux以格林尼治地區1970年01月01日0點開始計時,處在東八區的北京則實際上是以1970年01月01日早上8點開始計時。

        不信你試試下面兩個命令,看看輸出什麼:

[[email protected] ~]# date --date="19700101 00:00:00" +%s
-28800
[[email protected] ~]# date --date="19700101 08:00:00" +%s
0
二. linux時間的獲取和轉換。

-----------------------------------------------------------------------------------------------------------------------------------
                    |              系統呼叫              |                           庫函式                    
-----------------------------------------------------------------------------------------------------------------------------------
讀取時間    |   gettimeofday,time      | ftime,
-----------------------------------------------------------------------------------------------------------------------------------
格式轉換    |                                            | ctime,localtime,asctime,strftime,gmtime;mktime,
-----------------------------------------------------------------------------------------------------------------------------------
設定時間    |  settimeofday,stime    |
-----------------------------------------------------------------------------------------------------------------------------------

 1. 獲取基本時間資訊

  • time函式返回從Epoch(1970年1月1日00:00:00 UTC)開始所經過的秒數。
  • localtime /gmtime函式分別獲取年月日時分秒的數值(localtime是轉換成本地時間,gmtime是轉換成格林尼治時間)。
  • asctime/ctime函式把時間轉換成字串(ctime函式直接將time函式返回的time_t型別時間轉換成字串)。

       #include <time.h>

       time_t time(time_t *t);

       struct tm *localtime(const time_t *timep);

       struct tm *gmtime(const time_t *timep);

       char *asctime(const struct tm *tm);

 例如:

[[email protected] multi_job_submit]# cat get_cur_time.c

#include <stdio.h>
#include <time.h>

int main()
{
    time_t cur_t;
    struct tm* cur_tm;

    time(&cur_t);
    cur_tm=localtime(&cur_t);
    printf("Current time is: %s",asctime(cur_tm));

    cur_tm=gmtime(&cur_t);
    printf("Current time is: %s",asctime(cur_tm));

    printf("Current time is: %s",ctime(&cur_t));

    return 0;
}

執行結果:

[[email protected] multi_job_submit]# ./get_cur_time
Current time is: Sun Aug  3 17:32:28 2014
Current time is: Sun Aug  3 09:32:28 2014
Current time is: Sun Aug  3 17:32:28 2014

2. 獲取精確時間
  • gettimeofday獲取精確到微秒的系統時間,結構體型別為struct timeval。
  • struct timeval型別中的元素tv_sec等價於time函式獲取的系統時間,可進一步利用localtime/gmtime函式和asctime函式轉換格式。

       #include <sys/time.h>

       int gettimeofday(struct timeval *tv, struct timezone *tz);
       int settimeofday(const struct timeval *tv , const struct timezone *tz);

         struct timeval {
             time_t      tv_sec;     /* seconds */
             suseconds_t tv_usec;    /* microseconds */
         };

         struct timezone {
             int tz_minuteswest;     /* minutes west of Greenwich */
             int tz_dsttime;         /* type of DST correction */
         };

PS:使用函式gettimeofday/settimeofday的時候通常第二個引數設定為NULL。

例如:

[[email protected] multi_job_submit]# cat get_cur_utime.c

#include <time.h>
#include <sys/time.h>

int main()
{
    struct timeval cur_t;
    struct tm* cur_tm;

    gettimeofday(&cur_t,NULL);
    cur_tm=localtime(&cur_t.tv_sec);
    printf("Current time is: %sMicro seconds is: %d.\n",asctime(cur_tm),cur_t.tv_usec);

    return 0;
}

輸出結果:

[[email protected] multi_job_submit]# ./get_cur_utime
Current time is: Sun Aug  3 17:35:09 2014
Micro seconds is: 93337.

相關推薦

linux 時間獲取函式

一. linux時間漫談         linux內部對時間是用從Epoch時間開始計時的秒數來表示的。Epoch也就是通用協調時間(UTC,也就是格林尼治平均時間或格林威治標準時間,CMT)。linux將這個資料儲存在time_t結構體變數裡,目前的32為系統最多支撐到

linux時間函式

void get_local_time(long sec, char *plocaltime, int len) { struct tm t1 = {0}; localtime_r(&sec, &t1); snprintf(plocaltime, len, "%04d-%02

linuxC獲取系統時間的方法

asctime(將時間和日期以字串格式表示)   相關函式  time,ctime,gmtime,localtime   表頭檔案  #include<time.h>   定義函式  char * asctime(const struct tm * ti

Linux利用ioctl函式獲取網絡卡資訊

linux下的ioctl函式原型如下: #include <sys/ioctl.h> int ioctl(int handle, int cmd, [int *argc, int argv]) 函式成功返回0,失敗返回-1. 其相關命令介面如下:

Linux時間函式:struct timeval結構體

 Date: 2017/4/28 Linux時間函式的結構體如下: #include "sys/time.h" struct timeval { __time_t tv_sec;

Linux c獲取當前時間(精確到秒和毫秒或者微秒)

獲取當前的時間的秒數和微秒數本方法需要用到gettimeofday()函式,該函式需要引入的標頭檔案是sys/time.h 。 函式說明int gettimeofday (struct timeval * tv, struct timezone * tz)

linux統計程式/函式執行時間

如果只是初步統計或比較各函式的執行時間,可以用以下方法,若是想詳細統計專案中各個函式時間,建議使用第三方工具 一. 使用time 命令 例如編譯一個hello.c檔案 #gcc hel

linuxC獲取文件的大小

錯誤代碼 返回 system sys string 文件系統 識別碼 連接 chm 獲取文件大小這裏有兩種方法: 方法一、 範例: unsigned long get_file_size(const char *path) { unsigned lo

Linux程式設計獲取本地IP地址的常見方法

轉載於:http://blog.csdn.net/k346k346/article/details/48231933   在進行linux網路程式設計時,經常用到本機IP地址。本文羅列一下常見方法,以備不時之需。 獲取本機IP地址,是一個相當靈活的操作,原因是網路地址的設定非常靈活而且都是允

Linuxjava獲取CPU、記憶體、磁碟IO、網路頻寬使用率

原文地址:https://www.cnblogs.com/gisblogs/p/3985393.html 一、CPU 使用proc檔案系統,"proc檔案系統是一個偽檔案系統,它只存在記憶體當中,而不佔用外存空間。它以檔案系統的方式為訪問系統核心資料的操作提供介面。使用者和應用程式可以通過p

Linuxclock gettime函式詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux原子操作函式

Linux 下gcc內建的原子操作函式 標頭檔案 #include<asm/atomic.h> 編譯時需要加上-march= cpu-type(可以設定為native 讓系統自動去檢測) //先獲取值再操作 type __sync_fetch_an

linux 檔案同步函式(fflush、sync、fsync、fdatasync)之間差異

遇到機器異常關機時,寫log檔案資訊丟失問題,所以記錄下。   Linux實現中在核心設有緩衝區快取記憶體或頁面快取記憶體,大多數磁碟I/O都通過緩衝區進行。當我們向檔案寫資料時,核心通常先將資料複製到一個緩衝區中,如果該緩衝區尚未寫滿,則並不將其排入輸出佇列,而是等待寫滿或者核心需要重用該

(筆記)Linux的ioctl()函式詳解

我這裡說的ioctl函式是指驅動程式裡的,因為我不知道還有沒有別的場合用到了它,所以就規定了我們討論的範圍。寫這篇文章是因為我前一陣子被ioctl給搞混了,這幾天才弄明白它,於是在這裡清理一下頭腦。 一、 什麼是ioctl      ioctl是裝置驅動程

Linuxmount/umount函式應用

針對海思平臺system命令佔用資源較大的問題,因此程式中與系統呼叫相關的就只能用函式實現了。 demo mount.c: #include <sys/mount.h> int main

Linux的umask函式

umask函式為程序設定檔案模式建立遮蔽字,並返回以前的值。函式原型為: #include <sys/stat.h> mode_t umask(mode_t cmask); cmask是由下表列出的9個常量中的若干個按位“或”構成的 S_IRUSR      

ftp使用1——Linuxwget獲取ftp目錄檔案

如果某個目錄下有一個檔案可以使用ftp命令: get xxx 如果是某個目錄下有多個檔案(且不需要獲取目錄下子資料夾下的內容): mget * 如果是某個目錄下有子目錄希望獲取所有子目錄: wget -nH -m --ftp-user=myusername--f

Linuxcurses常用函式

一.全域性變數    WINDDW* curscr:當前螢幕   WINDOW* stdscr:標準螢幕   int   LINES:終端上的行數   int   COLS:終端上的列數   bool   TRUE:真標誌,1   bool   FALS

linux的靜態函式庫和動態函式

linux下的靜態庫和動態庫   最近在做Linux下應用程式的移植,用到了靜態庫和動態庫概念,從網上搜集了一些資料,並做了簡單整理,轉帖如下: 一、       簡單介紹 inux中有兩類

linuxsnmp4j獲取net-snmp的基本資訊

linux下,net-snmp已經提供了完整的snmp服務和框架,尤其是基本的snmp資訊,如sysObjectId、CPU、記憶體等。通過標準的snmp的oid,可以很容易的從net-snmp所提供的服務中獲取這些資訊。但net-snmp的trap功能需要通過指令碼來配置